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