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

Почему емкость ArrayList 10 по умолчанию?

Я видел Java-документ для ArrayList и обнаружил, что начальная емкость ArrayList равна 10.

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

Я думаю, что это имело бы смысл, если бы это была сила 2, но почему 10?

Я также проверил начальную емкость HashMap, и это имеет смысл.

/**
 * The default initial capacity - MUST be a power of two.
 */
static final int DEFAULT_INITIAL_CAPACITY = 16;

/**
 * Constructs an empty <tt>HashMap</tt> with the default initial capacity
 * (16) and the default load factor (0.75).
 */
public HashMap() {
    this.loadFactor = DEFAULT_LOAD_FACTOR;
    threshold = (int)(DEFAULT_INITIAL_CAPACITY * DEFAULT_LOAD_FACTOR);
    table = new Entry[DEFAULT_INITIAL_CAPACITY];
    init();
}

Есть ли какая-либо причина за номером 10?

4b9b3361

Ответ 1

ArrayList - простой растущий массив. При попытке добавить элемент, а размер буфера превышен, он просто растет. Таким образом, начальный размер может быть любым положительным значением.

1 будет слишком мало. Даже с несколькими элементами мы будем иметь несколько операций изменения размера.

100 будет потерять пространство.

Итак, 10 - это компромисс. Почему 10, а не 12 или 8? Первый намек на то, что типичные варианты использования были проанализированы, и это лучше всего подходит для потери производительности и потери пространства. Тем не менее, я думаю, увидев исходный код Sun, что он не был проанализирован настолько глубоко, и это произвольное "не слишком маленькое, не слишком большое" число.

Ответ 2

Для списка нет преимущества в том, что мощность может быть равна двум. На самом деле, нет никакой реальной выгоды в какой-либо конкретной стартовой емкости. Он должен быть достаточно большим, чтобы избежать множественных шагов изменения размера для обычного случая с небольшими списками и достаточно мала, чтобы не тратить память на неиспользуемую емкость в этом же случае. 10, вероятно, был выбран просто потому, что он попадает в правильный диапазон для выполнения этих требований и потому, что он "круглый".

Ответ 3

Vector, из JDK 1.0 была начальная емкость по умолчанию 10, поэтому, вероятно, имело смысл оставаться последовательным, когда они вводили ArrayList в 1.2.

Ответ 4

Полностью произвольный выбор.

И нет никакой причины, почему сила-2 здесь имеет смысл. Это имеет смысл в HashMap, из-за того, как работает хеширование. Фактически, она должна быть силой двух (согласно комментарию в источнике).

Обратите внимание, что java.util.Vector(который является старшим братом ArrayList) также имеет 10.

Ответ 5

10, вероятно, является более или менее произвольным числом для числа элементов по умолчанию.

Ответ 6

Если в коде есть комментарий, мы никогда не узнаем наверняка. Однако я полагаю, что в какой-то момент инженер Sun собрал статистику по использованию ArrayList в большом количестве реальных приложений и определил... эмпирически... что 10 дал примерно лучшие результаты в среднем. (То, как они настраивают такие вещи, как оптимизатор, дизайн байт-кода и т.д.)

И, и другие отметили, нет никакого вычислительного преимущества (или недостатка) при использовании размера, который является степенью двух для размера ArrayList.