equals與==的區別(詳解)

小本海發表於2020-10-05

前言

本文主要中原始碼的解釋上去看兩者的區別

==

對於基本資料型別來說,==比較的是兩者的值;對於引用型別來說,==比較的兩者的記憶體地址。

equals

對於基本資料型別來說,沒有equals方法;對於引用型別來說,equals比較的可能是記憶體地址,也可能是記憶體地址和值都比較,從equals的實現上來說,其實用的比較也是==,所以equals的具體比較得看重寫後的方法。具體如下:

對於Object型別來說,equals方法比較的是兩者的記憶體地址。但很多型別都重寫了equals方法,例如常用的String型別比較的就是記憶體地址和值,具體解析看如下原始碼。

  • Object

    public boolean equals(Object obj) {
    	return (this == obj);
    }
    
  • String

    public boolean equals(Object anObject) {
        // 第一個if,判斷兩者是否是同一個記憶體地址
        if (this == anObject) {
            return true;
        }
        // 第二個if,判斷兩者的值是否相同(將每個字元逐一比較)
        if (anObject instanceof String) {
            String anotherString = (String)anObject;
            int n = value.length;
            if (n == anotherString.value.length) {
                char v1[] = value;
                char v2[] = anotherString.value;
                int i = 0;
                while (n-- != 0) {
                    if (v1[i] != v2[i])
                        return false;
                    i++;
                }
                return true;
            }
        }
        return false;
    }
    

    equals方法重寫注意點

    1. 自反性:對任意引用obj,obj.equals(obj)的返回值一定為true.
    2. 對稱性:對於任何引用o1、o2,當且僅當o1.equals(o2)返回值為true時,o2.equals(o1)的返回值一定為true;
    3. 傳遞性:如果o1.equals(o2)為true, o2.equals(o3)為true,則o1.equals(o3)也一定為true
    4. 一致性:如果參與比較的物件沒任何改變,則物件比較的結果也不應該有任何改變
    5. 非空性:任何非空的引用obj,obj.equals(null)的返回值一定為false

參考

[1] https://zhidao.baidu.com/question/61622858.html

相關文章