1. 程式人生 > 實用技巧 >java hashcode方法

java hashcode方法

什麼是hashcode方法?
hashCode()方法作用是返回一個int型別的數值,也就是雜湊值,該方法的主要作用就是在雜湊的儲存結構中確定物件的儲存地址,雜湊值相同的物件會存放在同一個桶裡,所以雜湊值相同不代表兩個物件就相等了。

物件的hashcode怎麼得到?
hashcode就是通過hash函式得來的,通俗的說,就是通過某一種演算法得到的,hashcode就是在hash表中有對應的位置。hashcode只是代表了在hash表中的位置,和物件實際上的地址是不等同的,所以hashcode就是物件的地址的說法是錯誤的,一個物件肯定有它的實體地址,實體地址說的才是物件在記憶體中的地址。hashcode是通過物件的實體地址轉換為的一個整數,然後該整數通過hash函式演算法才得到的hashcode,這個hashcode對應物件在雜湊表中的位置。

具體過程是如何實現的呢?舉例,假如雜湊表中有6個位置,分別為1,2,3,4,5,6一個物件的實體地址轉換為整數13,13%6=1,那麼,它就被分配到雜湊表1這個位置,它的hashcode也為1,同理,別的物件如果hashcode也為1那麼它也會被分配到雜湊表的1位置。

為什麼hashcode不直接寫實體地址呢,還要另外用一張hash表來代表物件的地址?
因為HashCode的存在主要是為了查詢的快捷性,如Hashtable,HashMap等HashCode是用來在雜湊儲存結構中確定物件的儲存地址的(後半句說的用hashcode來代表物件就是在hash表中的位置)
從Object角度看,JVM每new一個Object,它都會將這個Object丟到一個Hash表中去,這樣的話,下次做Object的比較或者取這個物件的時候(讀取過程),它會根據物件的HashCode再從Hash表中取這個物件。這樣做的目的是提高取物件的效率。若HashCode相同再去呼叫equal。
至於為什麼hashcode查詢效率高,可以舉一個例子,1000個空位存放1000個不重複的數,最直接粗暴的方法就是每存一個數就對之前的數進行遍歷,看看有沒有重複的,這樣效率是非常低下的。我們可以用hash表來提高效率,假如雜湊表有8個位置1、2、3、4、5、6、7、8,存第一個數它對應雜湊表中1的位置,如果已經存了100個不相同的數,位置1裡有10個,那麼101個數的hashcode為1,那麼只需要與hashcode為1位置的其它10個數進行比較即可,不用遍歷其它所有數,當雜湊表的位置越多那麼你比較的次數就會越少。

equals()方法與hashcode()
我們可以用equals方法來驗證雜湊值相同不代表兩個物件的內容相同。

public static void main(String[] args) {
        String s1="通話";
        String s2="重地";
        System.out.println("s1="+s1.hashCode() + ":s2=" + s2.hashCode());
        System.out.println(s1.equals(s2));
    }

執行結果:

雖然s1和s2的hashhcode值相同,但是它們的內容很顯然是不一樣的,equal()方法的作用是判斷物件內容是否相同,結果是false,所以,兩個物件的雜湊值相等,並不一定能得出兩個物件的值也相等。

對此,可以得出結論:

  1. 如果兩個物件equals相等,那麼這兩個物件的HashCode一定也相同
  2. 如果兩個物件的HashCode相同,不代表兩個物件就相同,只能說明這兩個物件在雜湊儲存結構中,存放於同一個位置,也可以理解為放在同一個桶中