Я пытаюсь найти самый быстрый способ найти ключ в 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. Он работает нормально, но мне было интересно, есть ли более быстрый способ сделать это.
Если этот код работает, containsKey также будет работать. Кроме вы переопределяете equals, но забываете также переопределить метод hashCode. Что, кстати, нарушает договор. Если вы когда-нибудь реализуете собственный equals, вы должен также реализуете hashCode с той же логикой.
Хорошо, в этом гораздо больше смысла. вы правы, я не переопределял hashCode. Спасибо




Вам нужно переопределить hashcode() и equals(), если вы сначала класс Box, чтобы иметь возможность хорошо справиться с HashMap
Тогда вы можете просто сделать:
Box box = new Box(10, 5);
Box b = cells.containsKey(box) ? box : null;
Еще одна вещь, о которой следует помнить: элементы, которые используются в качестве ключей, должны быть неизменяемыми - по крайней мере, свойства, используемые в equals() и hashCode(), не должны изменяться (или, короче: хэш-код для ключа никогда не должен изменяться). Изменяемые ключи - плохая вещь на картах, из-за которой трудно отслеживать ошибки.
тогда вы должны переопределить
hashCode(), чтобы объекты с одинаковыми значениями получали одинаковые хэш-коды.