Ответ
Использование объекта в качестве ключа допустимо, но корректность работы HashMap или HashSet зависит от правильной реализации методов equals() и hashCode().
Поведение в зависимости от реализации:
| Реализация методов | Результат сравнения ключей | Пример map.get(new Key("id")) |
|---|---|---|
Без переопределения (используются методы Object) |
По ссылке (reference equality) | null (новый объект ≠ ключу в мапе) |
| С корректным переопределением | По содержимому (value equality) | Найдёт значение (объекты равны по полям) |
Пример корректного класса-ключа:
class Person {
private String name;
Person(String name) { this.name = name; }
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof Person)) return false;
return this.name.equals(((Person) o).name);
}
@Override
public int hashCode() {
return name.hashCode(); // Согласованность с equals()
}
}
Map<Person, String> map = new HashMap<>();
map.put(new Person("Alice"), "Engineer");
System.out.println(map.get(new Person("Alice"))); // Выведет: "Engineer"
Важно: Контракт между equals() и hashCode() требует, чтобы равные объекты возвращали одинаковый хэш-код.