Почему емкость 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?
Ответы
Ответ 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
.