🪪
OOP

Object Class: equals, hashCode, toString

Every Object's Built-in Toolkit
💡 Har Java object ke paas ek "default ID card" hota hai (Object class se) — toString() naam batata hai, equals() pehchaanta hai "ye wahi cheez hai kya", hashCode() ek unique-jaisa number deta hai fast lookup ke liye.

Har class implicitly Object class extend karti hai, isliye har object ko toString(), equals(), hashCode() free mein milte hain.

Default toString() ajeeb sa text deta hai (jaise ClassName@hashcode) — isliye hum usse override karte hain readable output ke liye.

equals() aur hashCode() ko saath mein override karna chahiye — HashMap/HashSet ko sahi se kaam karne ke liye ye zaroori hai.

class Point {
  int x, y;
  public String toString() { return "(" + x + "," + y + ")"; }
  public boolean equals(Object o) {
    if (!(o instanceof Point)) return false;
    Point p = (Point) o;
    return x == p.x && y == p.y;
  }
}
🪪
Har Java object ke paas ek "default ID card" hota hai (Object class se) — toString() naam batata hai, equals() pehchaanta hai "ye wahi cheez hai kya", hashCode() ek unique-jaisa number deta hai fast lookup ke liye.
1 / 5
Is page mein (4 subtopics)

equals() ka ek formal contract follow karna chahiye: reflexive (a.equals(a) hamesha true), symmetric (a.equals(b) == b.equals(a)), transitive (a=b aur b=c to a=c), aur consistent (bina data change kiye baar-baar call karne par same result). In rules ko todne se Collections (HashMap, HashSet) mein ajeeb, hard-to-debug bugs aate hain.

Rule: agar do objects equals() se equal hain, unka hashCode() bhi same hona *chahiye* (reverse zaroori nahi — alag objects same hashCode share kar sakte hain, "collision" kehlata hai, aur HashMap ise handle kar leta hai). Isiliye equals() override karte waqt hashCode() bhi hamesha saath override karo, warna HashMap/HashSet mein duplicate detection fail ho jaayega — same "equal" object do baar add ho sakta hai!

class Point {
  int x, y;
  public boolean equals(Object o) { /* x,y compare */ return true; }
  public int hashCode() { return Objects.hash(x, y); } // dono saath
}
⚠️Common Mistake: Sirf equals() override karke hashCode() bhool jaana ek bahut common bug hai — code compile ho jaata hai (koi error nahi), lekin HashSet mein duplicates allow ho jaate hain jo tumhare intent ke against hai.

Default toString() (ClassName@hashcode, jaise Point@1b6d3586) debugging mein useless hota hai. Override karke meaningful representation do — jaise "Point{x=3, y=5}". IDE aur logging tools automatically toString() use karte hain jab object print hota hai ya debugger mein dekha jaata hai.

Har object par .getClass() call karke uski runtime class pata kar sakte ho (obj.getClass().getName()) — ye equals() implementation mein instanceof ke bajaye bhi use hota hai kabhi-kabhi (strict type matching ke liye). Ye "Reflection" API ka entry point hai — advanced feature jisse runtime par classes/methods inspect/call kar sakte ho (frameworks jaise Spring isi par heavily depend karte hain, dependency injection ke liye).