Что делает метод get в Set в Java
Что проверяют
Это вопрос-ловушка. Правильный ответ начинается с того, что такого метода у Set нет, и интервьюер смотрит, скажете вы это прямо или начнёте выдумывать сигнатуру. Заодно проверяют, понимаете ли вы, чем множество отличается от списка и от отображения по контракту, а не по реализации.
Как отвечать
У интерфейса Set метода get нет и быть не может: множество не индексируется, порядок элементов в контракт не входит, поэтому обращаться по позиции не к чему. Скажите это и сразу покажите, что делать вместо:
- проверить наличие:
contains(o), работает черезhashCodeиequals; - обойти все элементы: цикл
for-each, итератор,forEach; - достать конкретный элемент:
set.stream().filter(...).findFirst(), это линейный проход; - у
NavigableSet, напримерTreeSet, естьfirst,last,floor,ceiling,higher; - если нужен именно объект по ключу, это признак того, что задаче подходит
Map, а неSet.
Хороший ход в конце: сказать, что желание «достать элемент по ключу из множества» почти всегда означает неверно выбранную структуру данных, и предложить Map с ключом, по которому шло сравнение.
Где спотыкаются
Начинают уверенно рассказывать про get(int index), перепутав с List. Даже если кандидат поправляется, впечатление уже испорчено: это не забытая деталь, а незнание базового интерфейса коллекций.
Утверждают, что множество всегда неупорядочено. Общий контракт действительно не обещает порядка, но LinkedHashSet сохраняет порядок вставки, а TreeSet держит элементы отсортированными. Неопределён порядок именно у HashSet, и он может измениться при увеличении таблицы.
Не связывают поиск с equals и hashCode. Объект без переопределённых методов не найдётся в HashSet по равному значению, а если изменить поле, участвующее в вычислении хеша, уже после добавления, элемент останется в множестве, но станет недостижимым.