正如我们所知,当添加元素时,ArrayList会将其大小增加50%(Vector的100%)。我们可以在哪里找到这种行为的实现吗?
THX
答案 0 :(得分:4)
我们在哪里可以找到此行为的实现?
在源代码中。您可以在Sun JDK安装的“src.zip”文件中找到Sun Java类库的源代码。 OpenJDK 6和OpenJDK 7的来源也可以通过OpenJDK Project page下载。对于其他Java实现,请查看Web或查阅文档。
谨防 - 并非所有Java类库都以相同的方式实现这些类。例如,查看Apache Harmony项目源代码或GNU Classpath项目源代码将不会告诉您Sun JDK类库的工作原理。
答案 1 :(得分:4)
在ArrayList
:
public void ensureCapacity(int minCapacity) { modCount++; int oldCapacity = elementData.length; if (minCapacity > oldCapacity) { Object oldData[] = elementData; int newCapacity = (oldCapacity * 3)/2 + 1; if (newCapacity < minCapacity) newCapacity = minCapacity; // minCapacity is usually close to size, so this is a win: elementData = Arrays.copyOf(elementData, newCapacity); } }
和Vector
:
private void ensureCapacityHelper(int minCapacity) { int oldCapacity = elementData.length; if (minCapacity > oldCapacity) { Object[] oldData = elementData; int newCapacity = (capacityIncrement > 0) ? (oldCapacity + capacityIncrement) : (oldCapacity * 2); if (newCapacity < minCapacity) { newCapacity = minCapacity; } elementData = Arrays.copyOf(elementData, newCapacity); } }
注意: capacityIncrement
默认为0
,除非另有设置,因此每次需要扩展后备阵列时Vector
的默认行为都会加倍但如果你设置capacityIncrement
,那么它将会增加。
同样在所有情况下(对于ArrayList
和Vector
),如果新容量仍然不够大,那么增加 - 无论它是什么 - 都会被取代,在这种情况下需要增加使用容量。
答案 2 :(得分:0)
..执行ArrayList#add!?
这是一个实现:
public boolean add(E object) {
if (lastIndex == array.length) {
growAtEnd(1);
}
array[lastIndex++] = object;
modCount++;
return true;
}
它会调用growAtEnd
,在此方法中我们会找到代码段:
} else {
int increment = size / 2;
if (required > increment) {
increment = required;
}
if (increment < 12) {
increment = 12;
}
E[] newArray = newElementArray(size + increment);
if (size > 0) {
System.arraycopy(array, firstIndex, newArray, 0, size);
firstIndex = 0;
lastIndex = size;
}
array = newArray;
..其中增量设置为当前列表实际大小的50%。
docjar包含Apache harmony project,Apaches开源Java SE 6平台的源代码。有许多不同的Java实现,并且不能保证每个实现都显示完全相同的行为(例如,以50%的步长增加大小),只要在此方法的接口中没有记录/需要它。 / p>