Почему Java не использует класс ArrayList для реализации класса Hashtable / HashMap? - PullRequest
3 голосов
/ 20 февраля 2012

Это QA Как Java реализует хеш-таблицы? описывает, что Hashtable реализуется через статический массив в Java (базовый статический массив будет уточняться в соответствии с общим числом элементов).

Почему Java не реализует Hashtable через динамический массив, такой как ArrayList?

Каковы компромиссы?

Ответы [ 3 ]

4 голосов
/ 20 февраля 2012

При изменении размера хеш-таблицы все записи должны быть переставлены.
Следовательно, использование ArrayList будет медленнее , поскольку ArrayList будет копировать ненужные старые значения до того, как HashTable пересчитает их все.

1 голос
/ 20 февраля 2012

Изменение размера базового массива требует перефразирования всех элементов в хеш-таблице, что является очень дорогостоящей операцией и делает недействительной позицию любого элемента, находящегося в данный момент в массиве - поэтому обычно вы удваивает размер массива каждый раз, когда количество элементов превышает определенный порог(коэффициент загрузки).Поскольку изменение размера осуществляется внутренне, а существующие элементы в любом случае должны быть перемещены на новую позицию, «массив с изменяемым размером», такой как ArrayList, не имеет смысла.

0 голосов
/ 20 февраля 2012

Классы реализации довольно непрозрачны. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ArrayList * * * * По сравнению с реальным статическим массивом *1001* довольно неочевидно, поэтому использовать его не нужно.

Вы не получите никакой выгоды, по крайней мере, таким образом вы сэкономите, имея обертку для статического массива, содержащего хэш-карту.

Изменение размера ArrayList было бы похоже на изменение размера HashMap, так как они оба работают со статическим базовым массивом, но в любом случае вам придется перефразировать все элементы карты, так что на самом деле нет необходимости использовать его .

...