Почему HashSet в Java должен быть повторен? - PullRequest
0 голосов
/ 26 ноября 2018

Я понимаю, что в Java класс HashMap реализует интерфейс Map, а класс HashSet реализует интерфейс Set.

Я также понимаю, что оба эти класса являются реализациями хеш-таблицы.

* 1004Тем не менее, почему необходимо перебирать HashSet, в то время как HashMap имеет метод get ()?Разве нет смысла в том, чтобы хэш-таблица могла извлекать элемент по значению, связанному с ним?

Я просмотрел документы, провел поиск и не смог найти ответ.

Заранее спасибо.

Ответы [ 3 ]

0 голосов
/ 26 ноября 2018

Я также понимаю, что оба эти класса являются реализациями хеш-таблицы.

Я думаю, вы виноваты в том, что слишком много о реализации.Как и для всех объектов, ключ - это открытый интерфейс, который дизайнер выбирает для вас.

Интерфейс Set не включает метод get для прямого доступа к отдельным объектам.Семантика отличается от Map, по дизайну.

0 голосов
/ 26 ноября 2018

Я думаю, что нет метода get, потому что hashset внутренне поддерживается hashMap, и все ваши значения set на самом деле хранятся как ключи этого HashMap, а значения - это просто постоянное поле с именем "PRESENT".Так что если у вас есть get (), это вызовет проблему.

Пожалуйста, обратитесь к ссылке ниже для более подробной информации http://www.java67.com/2014/01/how-hashset-is-implemented-or-works-internally-java.html

0 голосов
/ 26 ноября 2018

Метод get() HashSet (или любая реализация Set) будет избыточным, поскольку, если set.contains(x) возвращает true, у вас уже есть ссылка (x) на экземпляр, который считаетсяравный соответствующему элементу Set.

В интерфейсе Map необходимо map.get(key), чтобы получить значение, связанное с ключом.В интерфейсе Set есть только ключ, с которым нет (значащего) значения.

Я также понимаю, что оба этих класса являются реализациями хеш-таблицы.

Если под этим утверждением вы подразумевали, что HashSet реализован с резервным экземпляром HashMap, это просто детали реализации.Значения, соответствующие ключам этой основы HashMap, являются ссылками на один и тот же фиктивный объект.Нет никакой причины звонить get() для поддержки HashMap.

...