Ключ поиска в HashMap

Я пытаюсь найти самый быстрый способ найти ключ в HashMap и вернуть его.

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

Я использовал линейный поиск вот так:

Box b = null;
Box box = new Box(10, 5);
for (Box e : cells.keySet()) {
    if (box.equals(e)) {
        contains = true;
        b = e;
    }
}

Box - это класс, содержащий поля x и y. Он работает нормально, но мне было интересно, есть ли более быстрый способ сделать это.

тогда вы должны переопределить hashCode(), чтобы объекты с одинаковыми значениями получали одинаковые хэш-коды.

Jack Flamp 29.06.2018 12:57

Если этот код работает, containsKey также будет работать. Кроме вы переопределяете equals, но забываете также переопределить метод hashCode. Что, кстати, нарушает договор. Если вы когда-нибудь реализуете собственный equals, вы должен также реализуете hashCode с той же логикой.

Zabuzard 29.06.2018 12:58

Хорошо, в этом гораздо больше смысла. вы правы, я не переопределял hashCode. Спасибо

Maher Raess 29.06.2018 14:12
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
3
54
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вам нужно переопределить hashcode() и equals(), если вы сначала класс Box, чтобы иметь возможность хорошо справиться с HashMap


Тогда вы можете просто сделать:

Box box = new Box(10, 5);
Box b = cells.containsKey(box) ? box : null; 

Еще одна вещь, о которой следует помнить: элементы, которые используются в качестве ключей, должны быть неизменяемыми - по крайней мере, свойства, используемые в equals() и hashCode(), не должны изменяться (или, короче: хэш-код для ключа никогда не должен изменяться). Изменяемые ключи - плохая вещь на картах, из-за которой трудно отслеживать ошибки.

Thomas 29.06.2018 13:02

Другие вопросы по теме