java Arraylist大小?

时间:2010-06-22 05:50:57

标签: java collections

正如我们所知,当添加元素时,ArrayList会将其大小增加50%(Vector的100%)。我们可以在哪里找到这种行为的实现吗?

THX

3 个答案:

答案 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,那么它将会增加。

同样在所有情况下(对于ArrayListVector),如果新容量仍然不够大,那么增加 - 无论它是什么 - 都会被取代,在这种情况下需要增加使用容量。

答案 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>