本文以JDK 1.8為例,包路徑rt.jar java.util.lang 1 HashMap原理 在bucket中存儲鍵對象和值對象,作為Map.Entry。使用put(key,value)存儲對象到HashMap中,使用get(key)從HashMap中獲取對象。當我們給put方法傳遞鍵值的時候 ...
本文以JDK 1.8為例,包路徑rt.jar java.util.lang
容器 | 實現方式 | 重覆對象 | 空元素 | 順序 | 使用場景 |
List | 實現介面Collection | 可以有重覆對象 | 可以插入多個空元素 | 有序容器 | 經常訪問元素,使用list |
Set | 實現介面Collection | 不容許對象重覆 | 只能一個空元素 | 無序容器 | 插入數據唯一使用set |
Map | 介面 | 不容許對象重覆,鍵值對 | 只有一個null | 有序容器(預設升序) | 鍵值存儲用map |
比較 | 常用 | 線程安全,方法用Synchonized修飾 | 順序存儲 |
Set | HashSet | ConcurrentHashSet | LinkedHashSet |
Map | HashMap | ConcurrentHashMap | LinkedHashMap |
1 HashMap原理
在bucket中存儲鍵對象和值對象,作為Map.Entry。使用put(key,value)存儲對象到HashMap中,使用get(key)從HashMap中獲取對象。當我們給put方法傳遞鍵值的時候,我們先對鍵調用HashCode()方法,返回的HashCode用於找到bucket位置存儲Entry對象。
Hash碰撞:兩個鍵的HashCode相同即發生了Hash碰撞,HashMap是如何處理碰撞的呢,首先通過HashCode找到bucket位置,然後調用keys.equals()方法去找到LinkedList中正確的節點,最終找到要找的值對象。
HashMap只容許一條記錄的鍵為null,容許多條記錄的值為null。
2 ConcurrentHashMap原理
線程安全。為什麼提到是線程安全呢?因為該類中涉及到數據操作的時候都使用了關鍵字synchronized修飾。
ConcurrentHashMap使用了鎖分離技術。內部使用段Segment來分割,每個段其實就是一個小的Hashtable,他們有自己的鎖。只要多個修改操作發生在不同的段上,這些操作就可以併發進行。有些方法需要跨段,比如Size(),containsValue(),執行時需要鎖定整個表,而不是僅僅某個段,這時需要按順序鎖定所有段,操作完畢後,又按順序釋放所有段的鎖。
3 ArrayList原理