размер java arralist? - PullRequest
       0

размер java arralist?

0 голосов
/ 22 июня 2010

Как мы знаем, ArrayList увеличивает свой размер на 50% при добавлении элементов (на 100% в векторе). Где можно найти реализацию для этого поведения?

Thx

Ответы [ 3 ]

4 голосов
/ 22 июня 2010

В 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) увеличение - независимо от того, что это такое - отменяется, если новая емкость все еще недостаточно велика, и в этом случае используется требуемая емкость.

4 голосов
/ 22 июня 2010

Где мы можем найти реализацию для этого поведения?

В исходном коде. Вы можете найти исходный код библиотек классов Sun Java в файле "src.zip" в вашей установке Sun JDK. Исходники для OpenJDK 6 и OpenJDK 7 также доступны для скачивания через страницу OpenJDK Project . Другие реализации Java можно найти в Интернете или в документации.

Осторожно - не все библиотеки классов Java реализуют эти классы одинаково. Так, например, просмотр исходных текстов проекта Apache Harmony или исходных данных проекта GNU Classpath не скажет вам, как работают библиотеки классов Sun JDK.

0 голосов
/ 22 июня 2010

.. в реализации 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гармоничный проект , платформа Apache с открытым исходным кодом Java SE 6.Существует множество различных реализаций Java, и не гарантируется, что каждая реализация демонстрирует одинаковое поведение (например, увеличение размера с шагом 50%), если это не задокументировано / не требуется в интерфейсе этого метода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...