Vertel over botsingen in HashMap.
sobes.tech AI
Antwoord van AI
Een collision in HashMap treedt op wanneer twee verschillende sleutels dezelfde hash-code hebben. Dit leidt niet tot gegevensverlies, maar beïnvloedt de prestaties.
Bij het invoegen van een element:
- Wordt
hashCode()van de sleutel aangeroepen. - De index van de bak in de array wordt berekend op basis van de hash-code.
- Als de bak leeg is, wordt het element ingevoegd.
- Als de bak al elementen bevat, wordt
equals()voor elk element in de bak met de nieuwe sleutel aangeroepen. - Als
equals()trueretourneert, wordt de waarde bijgewerkt. - Als
equals()altijdfalseretourneert, wordt een nieuw element aan de bak toegevoegd.
Tot Android 7.0 (Nougat) gebruikte HashMap gekoppelde lijsten om collisions op te lossen. Bij veel collisions in één bak wordt gezocht in de gekoppelde lijst O(n), waarbij n het aantal elementen in de bak is.
Vanaf Android 7.0 converteert HashMap automatisch de gekoppelde lijst in een rode-zwart boom (TreeNode) voor bakken met veel collisions (drempel 8 elementen). Zoeken in de boom heeft complexiteit O(log n), wat de prestaties aanzienlijk verbetert bij veel collisions. Als het aantal elementen in de bak weer onder de drempel (6 elementen) komt, wordt de boom weer omgezet in een gekoppelde lijst.
Een goede implementatie van hashCode() en equals() voor aangepaste objecten is essentieel om collisions te minimaliseren en de efficiëntie van HashMap te waarborgen.
Voorbeeld:
@Override
public int hashCode() {
// Voorbeeld van een goede hashCode-implementatie
int result = 17;
result = 31 * result + field1.hashCode();
result = 31 * result + field2;
return result;
}
@Override
public boolean equals(Object o) {
// Voorbeeld van een correcte equals-implementatie
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
MyObject myObject = (MyObject) o;
return field2 == myObject.field2 &&
field1.equals(myObject.field1);
}