Meta trid overrid equals() biex tiddefinixxi ekwivalenza loġika, trid ukoll overrid hashCode() — minħabba li l-kolesccjonijiet ibbażati fuq hash (, ) jiddependu fuq il-kuntratt li . Li tkisser dan twassal għal bugs sottili u diffiċli li tsibu.
Meta trid overrid equals() biex tiddefinixxi ekwivalenza loġika, trid ukoll overrid hashCode() — minħabba li l-kolesccjonijiet ibbażati fuq hash (, ) jiddependu fuq il-kuntratt li . Li tkisser dan twassal għal bugs sottili u diffiċli li tsibu.
HashMapHashSet// by default, equals() compares IDENTITY (same object?), hashCode() is based on memory address
Person p1 = new Person("Ann", 30);
Person p2 = new Person("Ann", 30);
p1.equals(p2); // false by default — different objects, even with same data
Bedil overrid, żewġ oġġetti b'kontenut identiċi mhumiex "ekwivalenti" — ġeneralment mhux dik it-tema li trid għal value objects.
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Person p = (Person) o;
return age == p.age && Objects.equals(name, p.name); // compare by CONTENT
}
@Override
public int hashCode() {
return Objects.hash(name, age); // MUST be consistent with equals()
}
Il-kuntratt: jekk a.equals(b) huwa minnu, allura a.hashCode() == b.hashCode() JEW ikun minnu.
Person p1 = new Person("Ann", 30);
Person p2 = new Person("Ann", 30); // equal by our equals()
Set<Person> set = new HashSet<>();
set.add(p1);
set.contains(p2); // ❌ likely FALSE — even though p1.equals(p2)!
Għaliex? HashMap/HashSet l-ewwel juża hashCode() biex jsib il-sikkett t-tajba, imbagħad equals() ġewwa. B'hashCode() impliċitu (ibbażat fuq l-identità), p1 u p2 jiżżlu f'sikketti differenti, allura contains qatt ma jqarranihom — is-sett jaħseb li huma differenti. Dan jipproduċi bugs konfużi: duplikati f'Set, tfittxijas tal-mappa li fallew, eċċ.
1. equal objects → equal hash codes (REQUIRED for correctness)
2. unequal objects MAY have the same hash (collisions are allowed)
3. hashCode() must be consistent (same object → same code, unchanged)
4. equals() must be reflexive, symmetric, transitive, consistent
record Person(String name, int age) {} // records auto-generate equals/hashCode/toString!
Java records (u ġenerazzjoni IDE / Lombok) jiproduwu equals/hashCode korretti u konsistenti għalik.
Il-kuntratt equals/hashCode huwa waħda mir-regoli l-aktar importanti — u l-aktar spiss magħluqa — ta' Java.
L-overrid ta' equals() mingħajr hashCode() kiser il-kolesccjonijiet ibbażati fuq hash b'modi diffiċli biex taħdem: l-oġġetti li qiegħed tqis ekwivalenti jintilfu f'HashMap/HashSet (tfittxijas fallew, duplikati spettri) minħabba li huma hash għal sikketti differenti.
Bedil li dawn il-kolesccjonijiet huma kullimkien, kull klassi ta' tip ta' valur li tuża bħala ċavetta jew element set trid tqis it-tnejn konsistenzi.
L-għarfien għaliex (il-mekkaniżmu ta' tfittxija sikkett-imbagħad-ekwivalenti) — u l-użu ta' records jew kodiċi ġenerat biex tagħmilha sħiħ — huwa essenzjali għal imġieba korrett u tema tal-intervista klassika li turi għarfien tiegħek ta' kif jaħdmu l-kolesccjonijiet Java.
Librerija ta' mistoqsijiet ta' intervisti tal-IT b'tweġibiet dettaljati — minn Junior sa Senior.
Iddona