在Java中,每個對象都有一個地址,它是該對象在內存中的唯一位置。可以使用
Object.toString()方法來獲取一個對象的地址:
Object obj = new Object(); System.out.println(obj.toString()); // 輸出類名和地址,如 "java.lang.Object@3a4afd5c"
該字符串由類名、@符號和十六進制的無符號整數組成,后者就是對象的地址。它通常用于日志和調試。
然而,有時候更方便的是獲取一個對象的哈希碼(HashCode),它是一個int類型的數字,表示對象的散列值。Java中每個對象都有一個哈希碼,可以通過
Object.hashCode()方法來獲取:
Object obj = new Object(); System.out.println(obj.hashCode()); // 輸出該對象的哈希碼,如 "1011743182"
哈希碼的作用在于在散列表(Hashtable)等需要快速查找對象的數據結構中,可以根據它來定位對象的位置。Java的標準庫中很多類都利用了哈希碼,如
HashMap、
HashSet、
Hashtable等。
在實現自定義類時,為了保證比較對象的正確性,通常需要重寫
Object.equals()方法和
Object.hashCode()方法,以確保相等的對象哈希碼相等。例如:
public class Person { private String name; private int age; public Person(String name, int age) { this.name = name; this.age = age; } @Override public boolean equals(Object obj) { if (obj == null || !(obj instanceof Person)) { return false; } Person p = (Person) obj; return this.name.equals(p.name) && this.age == p.age; } @Override public int hashCode() { return Objects.hash(name, age); } // getters and setters... }
上述代碼中,重寫了
equals()方法和
hashCode()方法,以確保同時滿足以下條件:
- 兩個 Person 對象a和b,比較相等即返回 true,當且僅當 a.name 和 b.name 相同,且 a.age 和 b.age 相等。
- 如果兩個 Person 對象相等,它們的哈希碼必須相等。
當使用自定義類作為 HashMap 的鍵或 HashSet 的元素時,就可以通過重寫這兩個方法來保證正確性,避免出現意外的錯誤。