java -爲何重寫equals(),還須要重寫hashCode()?

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

equals()的定義:html

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

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

   可見,默認這個方法是比較這兩個引用對象的實際存儲的內存地址是否相同。固然,即使是同一個類建立的兩個對象,他們的內存地址也是不一樣的,因此,默認的equals()只有內存地址相同的對象(其實就是同一個引用對象的本身與本身的比較,這還有這樣他們的地址纔會相同),纔會返回true。java

固然,其餘的不少類繼承Object後,會對equals()進行重寫,它會對兩個對象的類型和對象內的內容進行比較,這個equals()對字符串相同的對象會獲得true。能夠看下String類中重寫的equals()方法。post

以下代碼:ui

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

 能夠看下String類中重寫的equals()方法。this

    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()url

Object的hashCode()默認也是對兩個對象存儲地址值的哈希,因此,兩個內容相同的對象的哈希值也會是不一樣的,因此重寫hashCode()也是根據咱們需求來修改hashCode()的功能,好比,String類的hashCode()的功能,對內容相同的字符串變量,會返回相同的哈希值。若是是調用Object的hashCode()方法,由於兩個String變量是兩個引用對象,返回的哈希值確定不相等的。spa

看看String中的hashCode()源碼:htm

   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(),這兩個是配套的。blog

看先下面的詳細解釋:

相關文章
相關標籤/搜索