摘要:也就是說生成的容量是,生成的容量是。因為是的,當鏈表的長度達到個時,就會轉(zhuǎn)化為紅黑樹進行存儲,這樣搜索效率就會達到。在查找元素的時候,當計算好數(shù)組下標后,判斷如果該節(jié)點是普通節(jié)點,就遍歷查找如果是,就使用紅黑樹的方式查找。
Map散列表 HashMap與LinkedHashMap
這2個Map是我們最常見的map。LinkedHashMap內(nèi)部使用了雙向鏈表來維護元素的順序,所以遍歷的時候取出來的元素順序和插入順序一致,而HashMap就不是。
可以看到LinkedHashMap繼承自HashMap,只不過它內(nèi)部保存了一個雙向鏈表來維護順序。下圖中,指針head、tail就是鏈表的首尾節(jié)點!
網(wǎng)上關(guān)于hashmap分析地比較好的文章:hashmap1.7與1.8JDK1.8的HashMap
因為現(xiàn)在都用1.8了,所以還是以1.8的為準。
關(guān)于HashMap以及ConcurrentHashMap,網(wǎng)上的分析已經(jīng)很透徹了。這里就提幾個點吧。
1.關(guān)于容量,HashMap的容量最小是16,每次擴容都是2的倍數(shù),這是有原因的。也就是說:
new HashMap<>(14)生成的map容量是16,new HashMap<>(24)生成的map容量是32。
2.負載因子loadFactor是0.75,也就是4分之3。當放入map的元素達到capacity * loadFactor時,就要進行擴容操作。假設(shè)我們初始化的容量是16,那么放入第12個元素時,就會進行擴容操作,變成32容量。
3.散列表的結(jié)構(gòu),我們需要提及一下元素put的時候如何決定放入數(shù)組的哪個格子里?如下圖,索引值=(n-1) & hash,n是map的大小。當map大小為16時,那么n-1的二進制就是000...001111(前面都為0,末4位為1);那么與hash值相與,結(jié)果就=000...00xxxx,即后4位由hash值所決定,hash值原來的后4位是什么就是什么,這樣最后的結(jié)果就處于0~15之間了,正好對應(yīng)大小為16的數(shù)組的索引范圍。
4.因為是1.8的HashMap,當鏈表的長度達到8個時,就會轉(zhuǎn)化為紅黑樹進行存儲,這樣搜索效率就會達到Olog~2~N。
5.在get查找元素的時候,當計算好數(shù)組下標后,判斷如果該節(jié)點是Node(普通節(jié)點),就遍歷查找;如果是TreeNode,就使用紅黑樹的方式查找。
HashTableHashTable又是一個遠古的類。HashTable與HashMap就如同Vector與ArrayList,這么一說你應(yīng)該明白了。HashTable也是使用synchronized修飾了其操作方法,鎖的粒度極大,不推薦使用!
TreeMapTreeMap的想法是,在遍歷元素的時候,之前的HashMap取出的元素是無序的,LinkedHashMap取出的元素是按照插入順序的,那我還需要按照自己定義的元素順序來保存元素,這樣取出元素的時候就符合我的需求了。所以TreeMap會根據(jù)插入k-v的key進行排序保存順序。
講講Map對應(yīng)的并發(fā)類Map對應(yīng)的并發(fā)類有:java.util.concurrent.ConcurrentHashMap類和Collections.synchronizedMap(Map map)所修飾的類。
Map類圖可以看到,4個map都實現(xiàn)了Map接口,HashTable作為遠古類只實現(xiàn)了Map接口;而HashMap和TreeMap還繼承了AbstractMap抽象類;其次,LinkedHashMap還繼承自HashMap。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.hztianpu.com/yun/77269.html
摘要:集合類類型解釋的父類集集合中的元素不按特定方式排序,并且沒有重復(fù)對象。他的有些實現(xiàn)類能對集合中的鍵對象進行排序。 集合類 2017-07-10 22:24:57 blog site https://github.com/Fiz1994 類型解釋: Collection : Set,List 的父類 Set(集):集合中的元素不按特定方式排序,并且沒有重復(fù)對象。他的有些實現(xiàn)類能對集合中的...
摘要:中的使用及在中的沖突方案引言簡稱是在作為的替代選擇新引入的,是包的重要成員。為了解決在頻繁沖突時性能降低的問題,中使用平衡樹來替代鏈表存儲沖突的元素。目前,只有和會在頻繁沖突的情況下使用平衡樹。 java中ConcurrentHashMap的使用及在Java 8中的沖突方案 1、引言 ConcurrentHashMap(簡稱CHM)是在Java 1.5作為Hashtable的替代選擇新...
摘要:增強的集合都可以是任何引用類型的數(shù)據(jù),的不允許重復(fù)即同一個對象的任何兩個通過方法比較總是返回。的這些實現(xiàn)類和子接口中集的存儲形式和對應(yīng)集合中元素的存儲形式完全相同。根據(jù)的自然順序,即枚舉值的定義順序,來維護對的順序。 Java8增強的Map集合 Key-value都可以是任何引用類型的數(shù)據(jù),Map的Key不允許重復(fù)即同一個Map對象的任何兩個key通過equals方法比較總是返回...
摘要:如果鍵不存在,則執(zhí)行壓棧操作之前創(chuàng)建的空列表。聲明當前類注教程的中文網(wǎng)官網(wǎng)附基礎(chǔ)知識整理之操作一基礎(chǔ)知識整理之操作二 Java操作Redis之操作數(shù)據(jù) 1.操作 String 1.1 源碼 public void stringOperator(){ //添加數(shù)據(jù) jedis.set(name, Wayfreem);// 添加一個 key 為 n...
閱讀 4040·2021-11-22 13:53
閱讀 1784·2021-08-25 09:39
閱讀 2495·2019-08-29 18:36
閱讀 1546·2019-08-26 13:35
閱讀 1279·2019-08-26 11:57
閱讀 1768·2019-08-23 15:57
閱讀 881·2019-08-23 14:55
閱讀 1226·2019-08-23 14:51