關於==和equals()方法
阿新 • • 發佈:2020-12-08
==
- 對於值物件,==比較的是兩個物件的值
- 對於引用物件,==比較的是兩個物件的地址
- 預設的
equals()
方法是等價於==
的- 之所以會有差異,是因為equals方法可以進行重寫
public class Test { public static void main(String[] args) { String a = "hello"; String b = "hello"; String c = new String("hello"); //在java中字串的值是不可改變的,相同的字串在堆記憶體中只會存一份,所以a和b指向的是同一個物件; System.out.println(a==b);//true //a和c在堆記憶體中的地址不同(c是新開闢的),所以a和b指向的不是同一個物件; System.out.println(a==c);//false //這裡的equals等價於==,因為a和b地址相同 System.out.println(a.equals(b));//true //這裡equals比較後兩個不同的物件,但結果確實true //說明Strung重寫過了equals方法 System.out.println(a.equals(c));//true //ab為同一個物件,應該擁有相同的hashcode,但c為另一個物件,hashchode應該不同 //說明String重寫了hashcode System.out.println(a.hashCode()); System.out.println(b.hashCode()); System.out.println(c.hashCode()); } }
記憶體分析
檢視String中的原始碼
可以看出在String類中對euqals()方法和hashcode方法進行了重寫
- equals
- equals
由此得出結論
- hashcode
- 因為重寫的存在,hashcode相同可能不是同一個物件
- 但hashcode不同的一定不是同一個物件的
- equals
- 因為重寫的存在,兩個物件euqals相等,不一定是同一個物件,如果hashcode沒有重寫,hashcode也不一定相等,因為從Object繼承來的hashCode是基於物件的ID實現的。
相同的物件,應該擁有相同的地址和hashcode,因此在判斷兩個物件是否相同時需要同時重寫hashcode,和equals方法