Хэш-карта Java: действительно ли не хватает keys ()? - PullRequest
0 голосов
/ 28 января 2012

Java HashTable является синхронизированной хэш-таблицей (и существует довольно долгое время), в то время как HashMap является несинхронизированной.

В HashTable есть 2 способа получить ключи хеш-таблицы:

Ключи , которые:

ключ
public Enumeration keys () Возвращает перечисление ключей в этой хеш-таблице.

и

public Set keySet ()
Возвращает представление Set содержащихся ключейв этом Hashtable.Набор поддерживается Хэш-таблицей, поэтому изменения в Хэш-таблице отражаются в наборе, и наоборот.Набор поддерживает удаление элемента (который удаляет соответствующую запись из Hashtable), но не добавление элемента.

В последнем явно указано, что ключи являются прямыми ссылками на хеш-таблицу (так что остерегайтесьмодификации и т. д.).

Но для keys() такого упоминания нет.

Итак, мой вопрос:

Возвращает ли keys() с помощью счетчика копию ключей (в отличие от keyset(), которые возвращают фактические ключи)?
И если да, то почемув HashMap такого метода нет и только keyset() предусмотрен?

Ответы [ 2 ]

2 голосов
/ 28 января 2012

Hashtable.keys возвращает ссылки на реальные ключи. Это не копирует их.

Метод не существует в HashMap, потому что keySet уже выполняет эту работу. Он существует в хеш-таблице, потому что этот класс существует с java 1.0. Каркас коллекций, который определяет метод keySet, не был добавлен до версии 1.2.

1 голос
/ 28 января 2012

В общем, итераторы в несинхронизированных коллекциях не ведут себя особенно хорошо (они склонны выбрасывать ConcurrentModificationException или ведут себя неопределенным образом)

Посмотрев на исходный код Hashtable , вы увидите, что итератор набора ключей и перечисление keys () фактически реализованы одним и тем же внутренним классом, который попытается вызвать исключение ConcurrentModificationException, если Изменения Hashtable. Так что нет, он не собирается делать копии ключей.

...