Хеш-таблица Java с отдельным разрешением коллизий цепочки? - PullRequest
2 голосов
/ 03 мая 2010

Я создал программу, используя встроенный java.util.hashtable, но теперь мне нужно разрешать коллизии, используя отдельную цепочку. Возможно ли с этой реализацией хеш-таблицы? Есть ли уже реализованный, который использует отдельную цепочку?

1 Ответ

4 голосов
/ 03 мая 2010

Глядя на источник реализации Hashtable, похоже, что он уже использует отдельную цепочку. Если вы посмотрите на класс Entry<K,V>, начинающийся со строки 901, вы увидите, что он имеет ссылку на другую запись с именем next. Если вы затем посмотрите на метод put(), в строке 420 ссылка next заполняется через конструктор, чтобы быть тем элементом, который был ранее сохранен в этом сегменте.

Обратите внимание, что вы, как правило, не должны беспокоиться о деталях реализации, подобных этим. Платформа Java Collections Framework, вероятно, является одной из наиболее широко используемых сред Java, и поэтому вы должны предположить, что авторы настроили производительность так, чтобы она была такой же хорошей, как и она.

Еще одна вещь, на которую я хотел бы обратить внимание, это то, что класс Hashtable был в основном заменен классом HashMap (который также использует отдельную цепочку, см. здесь ) , Основное различие между ними состоит в том, что все методы в Hashtable синхронизированы, тогда как в HashMap они не синхронизированы. Это приводит к повышению производительности в ситуациях, когда вы работаете в однопоточной среде (возможно, причина этого вопроса?).

Если вам нужно нужна реализация потокобезопасной карты, тогда вам следует рассмотреть либо обертывание нормального HashMap при вызове Collections.synchronizedMap(), либо использование ConcurrentHashMap.

...