Sobes.tech
Junior — Middle

Jakie mogą być konsekwencje używania zmiennych kluczy w kolekcjach danych?

sobes.tech AI

Odpowiedź od AI

Używanie zmiennych (mutable) kluczy w kolekcjach danych, takich jak HashMap lub HashSet w Java, może prowadzić do poważnych problemów. Głównym powodem jest to, że klucze powinny być niezmiennicze, aby kod hash i równość pozostały stałe.

Jeśli klucz zmieni się po dodaniu do kolekcji, to:

  • Kod hash klucza może się zmienić, a kolekcja nie będzie mogła znaleźć elementu po tym kluczu.
  • To spowoduje "zgubienie" elementu: pozostanie on w strukturze, ale dostęp do niego będzie niemożliwy.
  • Narusza to integralność danych i poprawne działanie kolekcji.

Przykład:

Map<List<String>, String> map = new HashMap<>();
List<String> key = new ArrayList<>();
key.add("initial");
map.put(key, "value");

// Zmiana klucza po dodaniu
key.add("changed");

// Próba pobrania wartości po kluczu nie powiedzie się
String val = map.get(key); // null

Dlatego zaleca się używanie niezmiennych obiektów jako kluczy, np. łańcuchów znaków, liczb lub specjalnie stworzonych niezmiennych klas.