Глядя на разных конструкторов коллекций, возникает вопрос. Почему ArrayList () создает пустой список с начальной емкостью десять, а ArrayDeque () создает пустой массив массивов с начальной емкостью, достаточной для хранения 16 элементов.
java
collections
Старый Бадман Грей
источник
источник
Ответы:
Краткий ответ
Поскольку емкость ArrayDeque должна быть степенью двойки, а 16 - это наименьшая степень двойки, равная по меньшей мере 10.
ArrayDeque должен использовать множество% операций везде, чтобы обернуть вокруг линейного массива, который притворяется круглым.
a % b
может быть выражено, какa & (b - 1)
будтоb
это степень двух. Побитовое И значительно быстрее, поэтому емкость ArrayDeque ограничена степенью двойки. Все операции% выполняются с битовой маскировкой вместо фактического% в реализации.По этой же причине в новой HashMap не используются размеры таблицы простых чисел, а используется степень двойки , опять же, поскольку операцию% нужно выполнять так часто и побитно, и это намного быстрее.
Таким образом, если базовая линия равна 10, то структуры, имеющие степень двух ограничений, должны использовать 16, потому что это наименьшая степень двух, по крайней мере, 10.
источник
Не исключайте возможности того, что нет конкретной причины.
Возможно, эти две коллекции были написаны разными командами. Оба выбрали небольшое число в качестве емкости по умолчанию, но первая команда думала десятично и выбирала 10, а вторая команда думала двоично и выбирала 16.
источник
Ответ @ Esailija хорош для этого конкретного случая.
В более общем смысле, это компромисс, который зависит от многих факторов. Я приведу несколько примеров:
В результате этих компромиссов вполне понятно, что разные реализации коллекций могут иметь различную оптимальную емкость по умолчанию.
источник