ArrayList VS Vector JVM内存使用情况

时间:2013-05-30 23:36:47

标签: java memory vector arraylist

与Vector相比,使用ArrayList会占用更少的内存吗?我已经读过Vector当向量达到最大大小时,它的内部数组大小加倍,而ArrayList只有一半吗?这是真实的陈述吗?当我没有使用initialcapacity和capacityIncrement的值声明Vector时,我需要答案。

3 个答案:

答案 0 :(得分:2)

是的,你在内部数组的内存分配方面是正确的:

在内部,ArrayList和Vector都使用Array保存其内容。当元素插入到ArrayList或Vector中时,如果对象耗尽空间,则该对象将需要扩展其内部数组。 Vector默认将其数组的大小加倍,而ArrayList将其数组大小增加50%。

<强>校正

并不总是这些Vector会使容量翻倍。它可能只是增加它的大小,直到构造函数中提到的增量:

public Vector(int initialCapacity, int capacityIncrement) 

grow方法中的逻辑是增加容量,如果没有提到增量,否则使用capacityIncrement,这里是Vector grow方法的代码:

private void grow(int minCapacity) {
    // overflow-conscious code
    int oldCapacity = elementData.length;
    int newCapacity = oldCapacity + ((capacityIncrement > 0) ?
                                     capacityIncrement : oldCapacity);
    if (newCapacity - minCapacity < 0)
        newCapacity = minCapacity;
    if (newCapacity - MAX_ARRAY_SIZE > 0)
        newCapacity = hugeCapacity(minCapacity);
    elementData = Arrays.copyOf(elementData, newCapacity);
}

答案 1 :(得分:1)

VectorArrayList之间没有比较,因为它们符合不同的目的。 Vector应该是一个并发安全List实现。但是,该类的设计存在严重缺陷,并且没有为最常见的迭代用例提供并发保证。

Vector本身很容易被Collections.synchronizedList替换(new ArrayList())。结果当然包含与Vector相同的缺陷。 Vector应被视为已弃用。

使用Vector现在是理解Java和并发编程的天真的标志。不要使用它。

答案 2 :(得分:0)

回答原始问题: 默认情况下,ArrayList会将容量增加一半的当前容量。但是,在任何时候,程序都可以调用ensureCapacity将容量设置为适当大的值。

默认情况下,

Vector会增加一倍的容量。但是,有一个构造函数允许设置增长量。使用较小的增长值会对性能产生负面影响。此外,您实际上可以获得更少的容量,因为每次增长都需要重复的数组在内存中存在一小段时间。

在评论中,OP表示:

  

应用程序提取大量数据集,由于最大化堆大小,我们目前面临内存不足

首先,如果程序试图将容量增加到超出设定限制,则VectorArrayList都会抛出OutOfMemoryError。您需要确保OOME不是来自hugeCapacity类的Vector方法。如果是这种情况,那么也许您可以尝试LinkedList

其次,你目前的堆大小是多少?默认的JVM堆大小相当小。目的是避免完整GC的暂停或不稳定行为对applet的用户变得明显。但是,对于相当复杂的应用程序或相当愚蠢的服务,堆大小通常也很小。 -Xmx JVM arg可用于增加堆大小。