与Vector相比,使用ArrayList会占用更少的内存吗?我已经读过Vector当向量达到最大大小时,它的内部数组大小加倍,而ArrayList只有一半吗?这是真实的陈述吗?当我没有使用initialcapacity和capacityIncrement的值声明Vector时,我需要答案。
答案 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)
Vector
和ArrayList
之间没有比较,因为它们符合不同的目的。 Vector
应该是一个并发安全List
实现。但是,该类的设计存在严重缺陷,并且没有为最常见的迭代用例提供并发保证。
Vector
本身很容易被Collections.synchronizedList替换(new ArrayList())。结果当然包含与Vector
相同的缺陷。 Vector
应被视为已弃用。
使用Vector
现在是理解Java和并发编程的天真的标志。不要使用它。
答案 2 :(得分:0)
回答原始问题:
默认情况下,ArrayList
会将容量增加一半的当前容量。但是,在任何时候,程序都可以调用ensureCapacity
将容量设置为适当大的值。
Vector
会增加一倍的容量。但是,有一个构造函数允许设置增长量。使用较小的增长值会对性能产生负面影响。此外,您实际上可以获得更少的容量,因为每次增长都需要重复的数组在内存中存在一小段时间。
在评论中,OP表示:
应用程序提取大量数据集,由于最大化堆大小,我们目前面临内存不足
首先,如果程序试图将容量增加到超出设定限制,则Vector
和ArrayList
都会抛出OutOfMemoryError
。您需要确保OOME不是来自hugeCapacity
类的Vector
方法。如果是这种情况,那么也许您可以尝试LinkedList
。
其次,你目前的堆大小是多少?默认的JVM堆大小相当小。目的是避免完整GC的暂停或不稳定行为对applet的用户变得明显。但是,对于相当复杂的应用程序或相当愚蠢的服务,堆大小通常也很小。 -Xmx
JVM arg可用于增加堆大小。