1. 程式人生 > 其它 >深入理解hashcode和equals

深入理解hashcode和equals

技術標籤:【JavaSE基礎】hashcode和equals

一、hashcode詳解

1、hashcode()用於返回字串的雜湊碼,hashcode是用於查詢使用的,equals用於比較兩個物件是否相等使用的。

class Test{
    public static void main(String[] args){
        String str = new String("www.baidu.com");
        System.out.print("字串的雜湊嗎為:" + str.hashcode());
    }
}

2、hashcode()方法:返回字串物件的雜湊值。

public int hashcode();

3、hashcode主要用於查詢的快捷性,是用來在雜湊儲存結構中確定物件的儲存地址,也就是物件在hash表中的位置,物理上可以說物件存放在記憶體中地址。

4、如果兩個物件相同,也就是A.equals(B)方法,那麼A,B的兩個物件的hashcode一定是相同的。

5、如果物件的hashcode方法被重寫,那麼物件的hashcode方法也應該被重寫,產生的物件,一定要和equals方法的使用的物件一致。

6、兩個物件的hashcode()相同,並不一定equals方法的兩個物件相同,只能說明這兩個物件在雜湊的儲存結構中,產生的物件並不相等。

7、為什麼hashcode查詢的更快呢?

現在我們要在記憶體中存放1000個不一樣的數。普通的方法就是儲存一個數字,一般儲存一個,遍歷一遍,看看有沒有相同的數。假如儲存10000條不一樣的資料的時候,就得各個遍歷,時間複雜度非常大,效率低。
現在我們使用hashcode來記錄物件的位置,進行查詢。

雜湊儲存:假設hash表中有1,2,3,4,5,6,7個雜湊儲存位置,儲存第一個數,hashcode為1,該數放在hash表中1的位置,存到1000個數時候,hash表中的7個位置可能有很多數字了。位置1中可能有200個數字,,當儲存1001個數字時候,先查hashcode物件的位置,假設對應的位置為1,因為在hash表中的位置相同,雜湊值相同,1001只需要比較表中200個數字是否相同即可,如果和200個數都不相同,則存放在1的這個位置,減少了查詢的次數。也就是hashcode碼相同,對應的物件不一定相同。

二、equals詳解以及 hashcode和equals的聯絡

1、equals方法,equals的作用是判斷兩個物件是否相等,如果物件重寫了equals方法,比較兩個物件的內容是否相等。如果沒有重寫,比較兩個物件的地址是否相同,等價於“==”。

2、“==”是判斷兩個地址是否相等,equals適合比較物件的內容是否相等,前提是不使用散列表容器,比如HashSet,HashTable,HashMap。

3、equals方法和hashcode的關係?

①在不建立類對應的散列表的時候,equals用來比較的是兩個物件是否相等,所以現在和hashcode()是沒有關係的

②建立類對應的散列表,比如建立了HashSet,HashTable,HashMap等等,在這種情況下:

<1> 如果兩個物件相等,那麼他們的hashcode()值一定是相等的,這裡的相等是通過equals比較兩個物件返回的true.

<2>如果兩個物件的hashcode值相等,他們並不一定相等。因為在散列表中,hashcode()相等,即兩個鍵值對的雜湊值相等,然而雜湊值相等並不一定得出鍵值對相等,此時會出現雜湊衝突。

三、總結

Java基礎真的很重要。一個一個知識點的過,慢慢熟悉基礎,熟悉底層原理。

加油!堅持!