Чому різні колекції java мають різну ємність за замовчуванням?


11

Дивлячись на різних конструкторів колекцій, питання приходить на думку. Чому ArrayList () створює порожній список з початковою ємністю десять, а ArrayDeque () конструює порожній макет масиву з початковою ємністю, достатньою для вміщення 16 елементів.


Я не новий тет був обмежений. Я просто додаю нові елементи з add (). Це завжди працює.
Tulains Córdova

1
Я думаю, що він говорить про початковий розмір масиву масиву всередині реалізації ArrayList. Як випливає з назви, ArrayList - це просто звичайний масив під обкладинками, і він створює великі масиви автоматично, коли ви намагаєтеся додати більше елементів, ніж його поточний розмір масиву містить.
dsw88

1
Я думаю, що StringBuilder - це ще одна, яка має ємність за замовчуванням, 10 чи 16?
Інго

@Ingo Цікаво. Я навіть не знав речей поза колекціями, зібравшись з місткістю, але, мабуть, це має сенс. У той час не було тегів на ємність, тому я не викликав великого інтересу до інших цілей.
Старий Бадман Грей

Відповіді:


17

Коротка відповідь

Тому що ємність ArrayDeque повинна бути потужністю дві, а 16 - найменша потужність двох, що становить принаймні 10.


ArrayDeque потрібно використовувати багато% операцій скрізь, щоб обернутися навколо лінійного масиву, який видається круговим.

a % bможна виразити так, a & (b - 1) ніби b це сила двох. Побіт AND значно більший, тому ємність ArrayDeque обмежена потужністю два. Усі% операцій виконуються з бітмейкінгом замість фактичного% у реалізації.

Це також, чому новіший HashMap не використовує розміри таблиці простих чисел, а потужність двох , знову ж таки тому, що операцію% потрібно виконувати так часто і побіжно, і це набагато швидше.

Отже, якщо базова лінія дорівнює 10, то структури, які мають потужність двох обмежень, повинні використовувати 16, бо це найменша потужність з двох, що становить принаймні 10.


3

Не виключайте можливості того, що немає конкретної причини.

Можливо, ці дві збірки написані різними колективами. Обидва обрали невелику кількість як за замовчуванням, але перша команда думала десятково і вибирала 10, а друга команда вважала двійковим і вибирала 16.


1

@ Відповідь Ісаїлії хороша для конкретного випадку.

Більш загально, але компроміс залежить від багатьох факторів. Наведу кілька прикладів:

  • Як зазвичай використовується структура даних ? Структури даних, які використовуються як буфери даних, як правило, віддають перевагу значно більшій ємності, ніж структури даних, наприклад, для малих кортежів.
  • Який розмір даних за замовчуванням входить у рядок кешу на вашій цільовій платформі процесора? Це може дуже змінити продуктивність, якщо за замовчуванням вписується рядок кешу. Вибір 10 за замовчуванням у Java може бути, тому що масив з 10 32-бітних слів плюс накладні масиви / об'єкти вписується в 64-байтну рядок кешу.
  • Скільки ви цінуєте простір проти ефективності виконання ? Якщо ви хочете покращити ефективність виконання, загалом краще заздалегідь виділити більше місця, щоб згодом уникнути зайвих перерозподілів.

В результаті цих компромісів цілком зрозуміло, що різні реалізації колекції можуть мати різну оптимальну потужність за замовчуванням.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.