Java中有兩種比較對象相等的方式:==和equals方法。
==是比較對象的地址是否相等。在Java中,所有的對象都是在堆內存中創建的,每個對象在創建時都有一個唯一的地址,這個地址被存儲在棧中,而==比較的就是這個地址是否相等。
String s1 = new String("hello"); String s2 = new String("hello"); System.out.println(s1 == s2); // false
上述代碼中,雖然s1和s2都是內容相等的字符串對象,但是它們在堆內存中分別有自己的地址,因此==比較的結果是false。
而equals方法是比較對象的內容是否相等。在Java中,所有的對象都繼承了Object類,Object類中的equals方法比較的就是對象的地址是否相等,因此如果要比較對象的內容是否相等,需要重寫equals方法。
class Person { private String name; private int age; public Person(String name, int age) { this.name = name; this.age = age; } public boolean equals(Object obj) { if (obj instanceof Person) { Person p = (Person) obj; return this.name.equals(p.name) && this.age == p.age; } return false; } }
上述代碼中,我們重寫了Person類的equals方法,比較的是Person對象的內容是否相等。如果兩個Person對象的name和age都相等,那么equals方法返回true,否則返回false。
需要注意的是,在重寫equals方法時,需要保證它滿足以下幾個條件:
- 自反性:對于任意非null的引用x,x.equals(x)都應該返回true。
- 對稱性:對于任意非null的引用x和y,如果x.equals(y)返回true,那么y.equals(x)也應該返回true。
- 傳遞性:對于任意非null的引用x、y和z,如果x.equals(y)返回true并且y.equals(z)也返回true,那么x.equals(z)也應該返回true。
- 一致性:對于任意非null的引用x和y,如果用于equals比較的對象沒有被修改,那么多次調用x.equals(y)應該始終返回true或始終返回false。
- 非空性:對于任意非null的引用x,x.equals(null)都應該返回false。
在使用Java比較對象相等時,需要根據具體的需求選擇使用==或equals方法,并且需要保證equals方法滿足上述條件。