Middle
bude HashMap fungovať, ak všetky pridávané kľúče majú rovnaký hashCode()?
sobes.tech AI
Odpoveď od AI
Áno, bude.
Pri rovnakom hashCode() budú všetky prvky padať do toho istého "kbelíka" (bucket) v HashMap. To povedie k degradácii HashMap na prepojený zoznam (alebo strom, ak je dostatok prvkov a používa sa Java 8+ s TreeNode), čo výrazne zhorší výkon operácií put(), get(), remove() na priemernú hodnotu O(n) namiesto O(1).
Takže HashMap bude správne fungovať, ale stratí svoju hlavnú výhodu v rýchlosti kvôli kolíziám hashov. Na rozlíšenie objektov s rovnakým hashom sa používa metóda equals().
class BadHashKey {
private String name;
public BadHashKey(String name) {
this.name = name;
}
@Override
public int hashCode() {
return 1; // Vždy vracia rovnaký hash kód
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
BadHashKey that = (BadHashKey) o;
return name.equals(that.name); // Kontrola rovnosti podľa mena
}
@Override
public String toString() {
return "BadHashKey{" +
"name='" + name + '\'' +
'}';
}
}
// Príklad použitia
// Map<BadHashKey, String> map = new HashMap<>();
// map.put(new BadHashKey("key1"), "value1");
// map.put(new BadHashKey("key2"), "value2"); // Oba kľúče budú v rovnakom "kbelíku"
// String value = map.get(new BadHashKey("key1")); // Vyhľadávanie bude pomalé