День 3 серії інтерв’ю з Java та Spring — Чому мій ключ у HashMap не знаходиться?

pic

Вступ:

HashMap (Хеш-мапи) є основою багатьох Java-додатків, але вони не завжди працюють без помилок. Невірне використання методів equals та hashCode може призвести до несподіваних багів. Давайте перевіримо, чи зможете ви знайти проблему в цьому сценарії.

Питання:

Розглянемо цей код:

import java.util.HashMap;  
import java.util.Objects;  
class Key {  
 private String id;  
 public Key(String id) {  
 this.id = id;  
 }  
 @Override  
 public boolean equals(Object o) {  
 if (this == o) return true;  
 if (o == null || getClass() != o.getClass()) return false;  
 Key key = (Key) o;  
 return Objects.equals(id, key.id);  
 }  
}  
public class HashMapDemo {  
 public static void main(String[] args) {  
 HashMap map = new HashMap<>();  
 map.put(new Key("1"), "Value1");  
 System.out.println(map.get(new Key("1")));  
 }  
}

Що виведе ця програма?

  1. Чи виведе вона “Value1”?
  2. Якщо ні, то чому?
  3. Як це виправити?

Відповідь:

  1. Чи виведе вона “Value1”? Ні, вона виведе null.
  2. Чому? Хоча метод equals правильно перевизначено, метод hashCode не реалізований. У HashMap (Хеш-мапі) ключі зберігаються в кошиках на основі їх хеш-кодів. Без належної реалізації методу hashCode новий об'єкт Key("1") не потрапляє в той самий кошик, що і оригінальний ключ.
  3. Як це виправити? Додайте правильну реалізацію методу hashCode:
@Override public int hashCode() {   
 return Objects.hash(id);   
}

З цією поправкою програма правильно виведе “Value1”.

Практичні висновки:

  1. Завжди перевизначайте equals та hashCode разом: Вони повинні працювати разом, щоб забезпечити правильну поведінку в колекціях, таких як HashMap (Хеш-мапа).
  2. Використовуйте Objects.hash: Це спрощує генерування хеш-кодів.
  3. Тестуйте з реальними випадками: Завжди тестуйте свої користувацькі об'єкти в колекціях, щоб забезпечити правильну поведінку.

Будьте допитливими і щасливого кодування! 🚀

Перекладено з: Day 3 of the Java & Spring Interview Series — Why Isn’t My HashMap Key Being Found?

Leave a Reply

Your email address will not be published. Required fields are marked *