Pastāstiet par sadursmēm HashMap.
sobes.tech AI
Atbilde no AI
HashMap rodas, kad divi dažādi atslēgas ir ar vienādu haškodu. Tas nerada datu zudumu, bet ietekmē veiktspēju.
Pievienojot elementu:
- Izsauc
hashCode()atslēgai. - Aprēķina baksta indeksu pēc haškoda masīvā.
- Ja baksts ir tukšs, elements tiek pievienots.
- Ja baksts jau satur elementus, katram elementam bakstā tiek izsaukts
equals()ar jauno atslēgu. - Ja
equals()atgriežtrue, vērtība tiek atjaunināta. - Ja
equals()vienmēr atgriežfalse, jauns elements tiek pievienots bakstā.
Līdz Android 7.0 (Nougat), HashMap izmantoja sasaistītus sarakstus kolīziju risināšanai. Kad kolīziju skaits vienā bakstā palielinās, meklēšana sasaistītajā sarakstā kļūst par O(n), kur n ir elementu skaits bakstā.
No Android 7.0, bakstos ar daudz kolīziju (slieksnis 8 elementi), HashMap automātiski pārvērš sasaistīto sarakstu par sarkani- melnu koku (TreeNode). Koka meklēšana ir O(log n), kas ievērojami uzlabo veiktspēju lielam kolīziju skaitam. Ja baksta elements atkal samazinās zem sliekšņa (6 elementi), koks tiek atkal pārvērsts sasaistītā sarakstā.
Laba hashCode() un equals() realizācija lietotāja objektiem — atslēga minimālai kolīziju skaitam un HashMap efektivitātei.
Piemērs:
@Override
public int hashCode() {
// Labs hashCode piemērs
int result = 17;
result = 31 * result + field1.hashCode();
result = 31 * result + field2;
return result;
}
@Override
public boolean equals(Object o) {
// Pareizs equals piemērs
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);
}