Объект без hashCode в роли ключа HashMap: что вернёт get
В сервисе кэшируют статусы заказов в обычной HashMap. Ключ — свой класс, у которого переопределён только equals.
class OrderKey {
private final String id;
OrderKey(String id) { this.id = id; }
@Override
public boolean equals(Object o) {
return o instanceof OrderKey && ((OrderKey) o).id.equals(this.id);
}
}
Map<OrderKey, String> cache = new HashMap<>();
cache.put(new OrderKey("A-1"), "готов");
System.out.println(cache.get(new OrderKey("A-1")));
Что будет напечатано и почему?
- готов — HashMap сравнивает ключи через equals, а он переопределён
- null — hashCode не переопределён, и два равных по equals объекта попадают в разные корзины
- готов — у одинаковых строк внутри объекта совпадает хеш, поэтому ключ найдётся
- null — HashMap не принимает пользовательские классы в качестве ключей без реализации Comparable
