Nalika kowe override equals() kanggo nemtokake keselarasan logis, kowe kudu uga override hashCode() — amarga koleksi berbasis hash (HashMap, ) ngandelake kontrak kang . Nglanggar iki bisa nyebabake bug sing tersamar lan susah dicari.
Nalika kowe override equals() kanggo nemtokake keselarasan logis, kowe kudu uga override hashCode() — amarga koleksi berbasis hash (HashMap, ) ngandelake kontrak kang . Nglanggar iki bisa nyebabake bug sing tersamar lan susah dicari.
HashSet// 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
Tanpa override, rong obyek kanthi konten identik ora "padha" — biasane ora apa sing dipenginake kanggo obyek nilai.
@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()
}
Kontrak: yen a.equals(b) bener, mulane a.hashCode() == b.hashCode() KUDU bener.
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)!
Pangapa? HashMap/HashSet dhisik nggunakake hashCode() kanggo golek ember sing bener, banjur equals() ing sajrone. Kanthi hashCode() standar (adhedhasar identitas), p1 lan p2 tiba ing ember sing beda, mula contains ora nglakokake padhepokan - set kuwi ngira-ngira yen padha beda. Iki ngasilake bug sing membingungkan: duplikat ing Set, pencarian peta gagal, lan liya-liyane.
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!
Record Java (lan pembuatan IDE / Lombok) ngasilake equals/hashCode sing bener lan konsisten kanggo sampeyan.
Kontrak equals/hashCode minangka salah siji peraturan paling penting — lan paling asring dilanggar — ing Java.
Override equals() tanpa hashCode() nglebuhi koleksi berbasis hash kanthi cara sing susah di-debug: obyek sing kowe anggep padha "hilang" ing HashMap/HashSet (pencarian gagal, duplikat hantu) amarga hash menyang ember beda.
Amarga koleksi iki ana ing mana-mana, saben kelas tipe nilai sing digunakake minangka kunci utawa elemen set kudu override loro-lorone kanthi konsisten.
Paham napa (mekanisme pencarian ember-banjur-equals) — lan nggunakake record utawa kode sing dibuat kanggo nggaweke bener — penting kanggo prilaku sing bener lan minangka topik wawancara klasik sing nuduhake pangerten sejati babagan cara kerja koleksi Java.