equals、 hashCode

一、Object類的equals和hashCode方法::

public boolean equals(Object obj) {
        return (this == obj);
    }
    
 public native int hashCode();

可以看到Object類的equals方法是判斷引用是否相等(和==的作用一樣),而不是比較對象中內部的值

二、String類的equals方法和hashCode方法:

 public boolean equals(Object anObject) {
        if (this == anObject) {
            return true;
        }
        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;
    }

public int hashCode() {
        int h = hash;
        if (h == 0 && value.length > 0) {
            char val[] = value;

            for (int i = 0; i < value.length; i++) {
                h = 31 * h + val[i];
            }
            hash = h;
        }
        return h;
    }

可以看到,String類覆蓋了Object類中的equals和hashCode方法,
String類的equals方法:首先是比較對象的引用是否相等,然後再比較對象的值是否相等;

我們想知道判斷兩個對象是否相等(引用是否相等),用==就可以進行判斷(比較兩個對象的地址是否相等);

對於一個類:
如果我們想知道它的兩個對象內部的值是否相等,而不是判斷他們是否指向同一個對象,此時就要覆蓋equals方法,來判斷值是否相等;如果不覆蓋Object類的equals方法,那麼類的對象進行比較時,默認調用的是Object類的equals方法,判斷的是引用是否相等,而不是判斷對象內部的值是否相等;

三、hashCode方法

hashCode方法的作用是計算對象的hash碼(即散列值)
Object的hashCode方法默認是使用對象的地址計算hash碼
具有相同引用的對象具有相同的hash碼;

一般來說,在每個覆蓋了equals方法的類中,也必須覆蓋hashCode方法,特別是在和HashMap、LinkedList等集合一起使用時:
用hashCode來計算hash值,計算將該對象放在哪個桶的後面,然後用equals來判斷該對象是否與桶後面的鏈表中的某個對象相等,如果equals返回false,說明兩個對象的值不相等,則將覆蓋原來的對象,如果equals返回true,則不放入該對象;

如果兩個對象hash值相等,但是equals不一定相等;
如果兩個對象的equals相等,則hash值一定相等;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章