hashmap其實也是乙個線性的陣列實現的,所以可以理解為其儲存資料的容器就是乙個線性陣列。這可能讓我們很不解,乙個線性的陣列怎麼實現按鍵值對來訪問資料呢?這裡hashmap有做一些處理。
1.首先hashmap裡面實現乙個靜態內部類entry 其重要的屬性有 key , value, next,從屬性key,value我們就能很明顯的看出來entry就是hashmap鍵值對實現的乙個基礎bean,我們上面說到hashmap的基 礎就是乙個線性陣列,這個陣列就是entry,map裡面的內容都儲存在entry裡面。
2.既然是線性陣列,為什麼能隨機訪問?這裡hashmap用了乙個小演算法,大致是這樣實現:
儲存時:
int hash = key.hashcode();--> 這個hashcode方法這裡不詳述,只要理解每個key的hash是乙個固定的int值
int index = hash % entry.length;
entry[index] = value;
取值時:
int hash = key.hashcode();
int index = hash % entry.length;
return entry[index]
到這裡我們輕鬆的理解了hashmap通過鍵值對實現訪問的基本原理
3.疑問:如果兩個key通過hash % entry.length得到的index相同,會不會有覆蓋的危險?
這裡hashmap裡面用到鏈式資料結構的乙個概念.上面我們提到過entry類裡面有乙個next屬性,作用是指向下乙個entry。
打個比方, 第乙個鍵值對a進來,通過計算其key的hash得到的index=0,記做:entry[0] = a.
一會後又進來乙個鍵值對b,通過計算其index也等於0,現在怎麼辦?hashmap會這樣做:b.next = a,entry[0] = b,
如果又進來c,index也等於0,那麼c.next = b,entry[0] = c;這樣我們發現index=0的地方其實訪問了a,b,c三個鍵值對,他們通過next這個屬性鏈結在一起。所以疑問不用擔心。
到這裡為止,hashmap的大致實現,我們應該已經清楚了。
當然hashmap裡面也包含一些優化方面的實現,這裡也囉嗦一下。
比如:entry的長度一定後,隨著map裡面資料的越來越長,這樣同乙個index的鏈就會很長,會不會影響效能?
hashmap裡面設定乙個因素(也稱為因子),隨著map的size越來越大,entry會以一定的規則加長長度。
Java集合中HashMap的實現原理
資料結構中實現資料儲存的方式主要有 陣列和鍊錶 陣列 陣列儲存區間是連續的,占用記憶體嚴重,故空間複雜的很大。但陣列的二分查詢時間複雜度小,為o 1 陣列的特點是 定址容易,插入和刪除困難 2.鍊錶 鍊錶儲存區間離散,占用記憶體比較寬鬆,故空間複雜度很小,但時間複雜度很大,達o n 鍊錶的特點是 定...
java中hashmap的作用
就是乙個鍵值對應的集合 hashmap a new hashmap a.put name abcdef key是name,value是字串abcdef system.out.println a.get name 根據key取得其值並輸出 list list new arraylist list.ad...
Java中HashMap的常用操作
前期準備 首先給hashmap裡面put一些鍵值對,如下 hashmaphashmap new hashmap hashmap.put 5,2 hashmap.put 9,2 hashmap.put 8,1 hashmap.put 7,3 hashmap.put 16,1 hashmap.put 1...