hash表及HashCode方法解析

1、hash

hash是一個函數,通過一系列的算法來得到一個hash值,hash表中的地址值。hash表就是所有的hash值組成的,有很多種hash函數,也就代表着有很多種算法得到hash值,如上面截圖的三種。hash函數就是根據key計算出應該存儲地址的位置,而哈希表是基於哈希函數建立的一種查找表。

2、hash表

也叫散列表,一種散列存儲結構,通過hashcode直接確定對象在hash表中的地址

3、hashcode

    HashCode的存在主要是爲了查找的快捷性,HashCode是用來在散列存儲結構中確定對象的存儲地址的。hash是直接計算出存儲位置,比遍歷快。
    hashcode就是通過hash函數得來的一個值,通俗的說,就是通過某一種算法得到的,hashcode就是在hash表中有對應的位置。每個對象都有對應自己的hashcode,通過對象的內部地址(也就是物理地址)轉換成一個整數,然後該整數通過hash函數的算法就得到了hashcode,所以,hashcode是什麼呢?就是在hash表中對應的位置。這裏如果還不是很清楚的話,舉個例子,hash表中有 hashcode爲1、hashcode爲2、(...)3、4、5、6、7、8這樣八個位置,有一個對象A,A的物理地址轉換爲一個整數17(這是假如),就通過直接取餘算法,17%8=1,那麼A的hashcode就爲1,且A就在hash表中1的位置。

4、hashcode和equals

  先通過hashcode來比較,如果hashcode相等,那麼就用equals方法來比較兩個對象是否相等,用個例子說明:上面說的hash表中的8個位置,就好比8個桶,每個桶裏能裝很多的對象,對象A通過hash函數算法得到將它放到1號桶中,當然肯定有別的對象也會放到1號桶中,如果對象B也通過算法分到了1號桶,那麼它如何識別桶中其他對象是否和它一樣呢,這時候就需要equals方法來進行篩選了。

 1、如果兩個對象equals相等,那麼這兩個對象的HashCode一定也相同

 2、如果兩個對象的HashCode相同,不代表兩個對象就相同,只能說明這兩個對象在散列存儲結構中,存放於同一個位置

重寫equals的方法的時候,建議也重寫hashcode方法

5、hash衝突

不管hash函數設計的如何巧妙,總會有特殊的key導致hash衝突,特別是對動態查找表來說

①開放定址法:
                         當一個關鍵字和另一個關鍵字發生衝突時,使用某種探測技術在Hash表中形成一個探測序列,然後沿着這個探
                         測序列依次查找下去,當碰到一個空的單元時,則插入其中
②鏈地址法:
                      產生hash衝突後在存儲數據後面加一個指針,指向後面衝突的數據(hashmap)
③公共溢出區法:
                        建立一個特殊存儲空間,專門存放衝突的數據。此種方法適用於數據和衝突較少的情況。
④再散列法:
                       準備若干個hash函數,如果使用第一個hash函數發生了衝突,就使用第二個hash函數,第二個也衝突········

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