Junior — Middle
Ինչպե՞ս է փոխվում HashMap-ի կառուցվածքը և վարքագիծը Java-ում բանալիի փոփոխությունից հետո։
sobes.tech AI
Պատասխան AI-ից
HashMap-ի մեջ բանալիները օգտագործվում են հեշ-կոդը հաշվարկելու և տարրերի դիրքը որոշելու համար ներքին կառուցվածքում (bucket): Եթե օգտագործվող բանալին փոխվի այնպես, որ փոխվի նրա հեշ-կոդը կամ equals() մեթոդի արդյունքը, դա խանգարի HashMap-ի աշխատանքին:
Ինչու?
- Երբ ավելացվում է տարր, բանալին հեշավորվում է և տարրն տեղադրվում է որոշակի bucket-ում:
- Երբ որոնվում է տարր,
HashMapհաշվում է հեշը և որոնում համապատասխան bucket-ում:
Եթե բանալին փոխվի ավելացման հետո, նոր վիճակում հաշվող հեշը կլինի տարբեր և տարրն չի գտնվի — այն "կորչում" է քարտեզում:
Աստված, HashMap-ի բանալիները պետք է լինեն չփոխվող (immutable) կամ չփոխվեն այնքան ժամանակ, քանի դեռ օգտագործվում են որպես բանալիներ:
Օրինակ խնդիր:
class Key {
int id;
Key(int id) { this.id = id; }
public int hashCode() { return id; }
public boolean equals(Object o) { return o instanceof Key && ((Key)o).id == id; }
}
Key key = new Key(1);
HashMap<Key, String> map = new HashMap<>();
map.put(key, "արժեք");
key.id = 2; // փոխվել է բանալին
System.out.println(map.get(key)); // null, քանի որ բանալին "կորչել" է