java -為什么重寫equals(),還需要重寫hashCode()?


1.先post這兩個方法的基本定義:

equals()的定義:

    淺談Java中的equals和==(轉)

hashCode()的定義:
 這兩個方法全部都是object類定義的方法,只要繼承了object類的類,默認繼承這兩個方法。看源碼,
(1)package java.lang.Object.equals()

   可見,默認這個方法是比較這兩個引用對象的實際存儲的內存地址是否相同。當然,即便是同一個類創建的兩個對象,他們的內存地址也是不同的,所以,默認的equals()只有內存地址相同的對象(其實就是同一個引用對象的自己與自己的比較,這還有這樣他們的地址才會相同),才會返回true。

當然,其他的很多類繼承Object后,會對equals()進行重寫,它會對兩個對象的類型和對象內的內容進行比較,這個equals()對字符串相同的對象會得到true。可以看下String類中重寫的equals()方法。

如下代碼:

String s1="uiop0";
String s2="uiop0";
System.out.println(s1.equals(s2));
	 

 可以看下String類中重寫的equals()方法。

    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;
    }

  

(2)package java.lang.Object.hashCode()

Object的hashCode()默認也是對兩個對象存儲地址值的哈希,所以,兩個內容相同的對象的哈希值也會是不同的,所以重寫hashCode()也是根據我們需求來修改hashCode()的功能,比如,String類的hashCode()的功能,對內容相同的字符串變量,會返回相同的哈希值。如果是調用Object的hashCode()方法,因為兩個String變量是兩個引用對象,返回的哈希值肯定不相等的。

看看String中的hashCode()源碼:

   public int hashCode() {
        int h = hash;//默認hash=0
        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;
    }

  可以看見,它是對兩個字符串按照下面的規則,計算新的哈希值,這樣算出的來兩個相同字符串相變量哈希值是相等的。

 h = 31 * h + val[i];

 2.解釋一下,為什么重寫equals(),還需要重寫hashCode()的原因

主要原因是定義的新的類在使用hashMap()是實際到,key值的計算問題。當我們用自定義的類的作為key時,怎么判斷這相同的類對象的唯一性,這里涉及到hashMap()的判斷機制,先比較hashCode(),當哈希值相同時,再比較equals(),這兩個是配套的。

看先下面的詳細解釋:

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM