Подтвердить что ты не робот

Документация API JDK неверна для конструктора ArrayList. Это ошибка?

JDK doc для Конструктор ArrayList говорит, что начальная емкость составляет 10.

Это фактически неверно, поскольку начальная емкость равна 0, пока в список не добавится что-то. Я проверил источник Open JDK, а также src.zip, который поставляется с JDK.

Я понимаю, что это оптимизация производительности, но это будет считаться ошибкой?

4b9b3361

Ответ 1

Действует только для JDK до 6

Это не ошибка.

Первоначальная емкость внутреннего массива, используемого для хранения элементов списка, действительно равна 10.

Это не означает, что размер списка равен 10. Только то, что создается пустой массив размером 10.

Когда объект добавляется в список, внутренний указатель на последний элемент перемещается один за другим. Если емкость массива недостаточна, создается еще один массив с большей емкостью, а старый массив копируется в первой части нового массива. В этот момент емкость массива не более 10.

Код:

public ArrayList() {
    this(10);   // Here the 10 of the default capacity
}

public ArrayList(int initialCapacity) {
    super();
    if (initialCapacity < 0)
        throw new IllegalArgumentException("Illegal Capacity: "+
                                                initialCapacity);
    this.elementData = new Object[initialCapacity];
}

Для нового JDK (из java 1.7)

Важное примечание. Да в более новых версиях ArrayList (я думаю, из Java7) исходный код изменился. Документация остается старой. Так что да, это ошибка в документации!

Здесь новая версия конструктора

private static final Object[] EMPTY_ELEMENTDATA = {};

....

public ArrayList() {
    super();
    this.elementData = EMPTY_ELEMENTDATA;  // This is 0 capacity!!!!
}

ПРИМЕЧАНИЕ. Я открыл новую ошибку для Oracle, чтобы просмотреть документацию.

Ответ 2

Это ошибка в документации. Они забыли обновить комментарий.

JDK 7:

 public ArrayList() {
     this(10);
 }

JDK 8:

/**
 * Constructs an empty list with an initial capacity of ten.
 */
public ArrayList() {
    super();
    this.elementData = EMPTY_ELEMENTDATA;
}

Ответ 3

из 1.7. Они говорят, что после добавления в него первого элемента будет создан ArrayList размером 10 по умолчанию. Это означает, что объект ArrayList не будет создан до тех пор, пока мы не добавим в него элемент, прочитайте описание, elementData '(Любой пустой ArrayList с elementData == EMPTY_ELEMENTDATA будет расширен DEFAULT_CAPACITY {это переменная int}, когда добавлен первый элемент.). Это как ленивый экземпляр.

В версии 1.6, хотя мы не добавляем элемент в ArrayList, он создает 10-ти размерный пустой массив объектов, как бы желаемый экземпляр.

 /**
 * Default initial capacity.
 */
private static final int DEFAULT_CAPACITY = 10;

/**
 * Shared empty array instance used for empty instances.
 */
private static final Object[] EMPTY_ELEMENTDATA = {};


 /*
 * The array buffer into which the elements of the ArrayList are stored.
 * The capacity of the ArrayList is the length of this array buffer. Any
 * empty ArrayList with elementData == EMPTY_ELEMENTDATA will be expanded    
 * DEFAULT_CAPACITY when the first element is added.
 */

private transient Object[] elementData;
 /**
 * Constructs an empty list with an initial capacity of ten. (they might have forgot to update this..)
 */
public ArrayList() {
    super();
    this.elementData = EMPTY_ELEMENTDATA;
}
 /*