Sobes.tech
Junior — Middle

Чӣ гуна тағир додани калид ба сохтор ва рафтори HashMap дар Java таъсир мерасонад?

sobes.tech AI

Ҷавоб аз AI

Дар HashMap дар калидҳо барои ҳисоб кардани коди хеш ва муайян кардани ҷойгиршавии унсур дар сохтори дохилӣ (бакет) истифода мешавад. Агар объекте, ки ҳамчун калид истифода мешавад, тағир дода шавад, то ки коди хеш ё натиҷаи усули equals() тағир ёбад, ин кори HashMap-ро вайрон мекунад.

Чаро?

  • Вақте ки як унсур илова карда мешавад, калид хеш карда мешавад ва унсур дар бакети муайян ҷойгир мешавад.
  • Вақте ки унсур бо калид ҷустуҷӯ мешавад, HashMap хешро ҳисоб мекунад ва дар бакети мувофиқ ҷустуҷӯ мекунад.

Агар калид пас аз илова кардан тағир ёбад, дар ҷустуҷӯ бо ҳолати нав, хеши дигар ҳисоб карда мешавад ва унсур пайдо намешавад — он дар харита "гум мешавад".

Аз ин рӯ, калидҳо дар 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, зеро калид "гум шуд"