Sobes.tech
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, քանի որ բանալին "կորչել" է