hash是乙個函式,通過一系列的演算法來得到乙個hash值,hash表中的位址值。hash表就是所有的hash值組成的,有很多種hash函式,也就代表著有很多種演算法得到hash值,如上面截圖的三種。hash函式就是根據key計算出應該儲存位址的位置,而雜湊表是基於雜湊函式建立的一種查詢表。
也叫雜湊表,一種雜湊儲存結構,通過hashcode直接確定物件在hash表中的位址
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的位置。
先通過hashcode來比較,如果hashcode相等,那麼就用equals方法來比較兩個物件是否相等,用個例子說明:上面說的hash表中的8個位置,就好比8個桶,每個桶裡能裝很多的物件,物件a通過hash函式演算法得到將它放到1號桶中,當然肯定有別的物件也會放到1號桶中,如果物件b也通過演算法分到了1號桶,那麼它如何識別桶中其他物件是否和它一樣呢,這時候就需要equals方法來進行篩選了。
1、如果兩個物件equals相等,那麼這兩個物件的hashcode一定也相同
2、如果兩個物件的hashcode相同,不代表兩個物件就相同,只能說明這兩個物件在雜湊儲存結構中,存放於同乙個位置
重寫equals的方法的時候,建議也重寫hashcode方法
不管hash函式設計的如何巧妙,總會有特殊的key導致hash衝突,特別是對動態查詢表來說
①開放定址法:
當乙個關鍵字和另乙個關鍵字發生衝突時,使用某種探測技術在hash表中形成乙個探測序列,然後沿著這個探
測序列依次查詢下去,當碰到乙個空的單元時,則插入其中
②鏈位址法:
產生hash衝突後在儲存資料後面加乙個指標,指向後面衝突的資料(hashmap)
③公共溢位區法:
建立乙個特殊儲存空間,專門存放衝突的資料。此種方法適用於資料和衝突較少的情況。
④再雜湊法:
準備若干個hash函式,如果使用第乙個hash函式發生了衝突,就使用第二個hash函式,第二個也衝突········
Hash碼概念,預設hashCode 方法的計算
物件的雜湊值就是乙個普通的十進位制陣列,源於父類object hashcode 原始碼 public native int hashcode 如果沒有重寫父類,每次執行的結果都是不同整數,稱為雜湊值,沒有特別意義 但是如果子類重寫父類方法,雜湊值就會是自定義的雜湊值 public static vo...
重寫hashCode 方法和equals 方法
1 object類中有hashcode 和equals方法 public native int hashcode 根據位址進行運算得到的偽隨機數 public boolean equals object obj a.equals b ab物件內容相同,可能是同乙個位址,這種情況hashcode一定相...
重寫equals方法和hashcode方法
public class person instanceof 已經處理了obj null的情況 if obj instanceof person person perobj person obj return perobj.age age perobj.name.equals name 重寫hash...