1. 程式人生 > 實用技巧 >關於==和equals()方法

關於==和equals()方法

  • ==
    • 對於值物件,==比較的是兩個物件的值
    • 對於引用物件,==比較的是兩個物件的地址
  • 預設的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方法

參考資料hashcode詳解 - 有夢想的老王 - 部落格園 (cnblogs.com)