Map.get
是 Java 集合框架中 Map
接口的一個(gè)方法,用于根據(jù)鍵獲取對(duì)應(yīng)的值。其內(nèi)部實(shí)現(xiàn)原理依賴于具體的 Map 實(shí)現(xiàn)類。以下是幾種常見 Map 實(shí)現(xiàn)類的 get
方法內(nèi)部實(shí)現(xiàn)原理的簡(jiǎn)要概述:
-
HashMap:
- 時(shí)間復(fù)雜度:在平均情況下為 O(1),在最壞情況下(所有鍵都映射到同一個(gè)桶)為 O(n)。
- 實(shí)現(xiàn)原理:
- 使用哈希表存儲(chǔ)鍵值對(duì)。
- 計(jì)算鍵的哈希值,確定鍵值對(duì)在哈希表中的位置(桶)。
- 遍歷該桶中的所有元素,使用
equals
方法檢查當(dāng)前元素是否與給定的鍵相等。
- 如果找到相等的鍵,則返回對(duì)應(yīng)的值;否則返回
null
。
-
TreeMap:
- 時(shí)間復(fù)雜度:始終為 O(log n),因?yàn)榛诩t黑樹實(shí)現(xiàn)。
- 實(shí)現(xiàn)原理:
- 使用紅黑樹存儲(chǔ)鍵值對(duì)。
- 根據(jù)鍵的自然順序或自定義比較器對(duì)鍵進(jìn)行排序。
- 遍歷紅黑樹,找到與給定鍵相等的節(jié)點(diǎn),然后返回對(duì)應(yīng)的值。
-
LinkedHashMap:
- 時(shí)間復(fù)雜度:在平均和最壞情況下均為 O(1)。
- 實(shí)現(xiàn)原理:
- 繼承自 HashMap,但維護(hù)了一個(gè)雙向鏈表來記錄插入順序或訪問順序。
get
方法首先在哈希表中查找鍵,如果找到則返回對(duì)應(yīng)的值,并更新鏈表中的訪問順序(如果需要)。
- 如果未找到,則返回
null
。
-
ConcurrentHashMap:
- 時(shí)間復(fù)雜度:在多線程環(huán)境下,
get
方法的時(shí)間復(fù)雜度接近 O(1)。
- 實(shí)現(xiàn)原理:
- 使用分段鎖(在 Java 8 之后改為使用 CAS 操作和synchronized)來實(shí)現(xiàn)高并發(fā)訪問。
- 每個(gè)段(Segment)內(nèi)部使用哈希表存儲(chǔ)鍵值對(duì)。
get
方法首先確定要查詢的段,然后在對(duì)應(yīng)段的哈希表中查找鍵,并返回對(duì)應(yīng)的值。
這些實(shí)現(xiàn)原理說明了為什么不同的 Map 實(shí)現(xiàn)類在性能和使用場(chǎng)景上有所差異。例如,HashMap 適用于需要快速查找、插入和刪除的場(chǎng)景,而 TreeMap 則適用于需要按鍵排序的場(chǎng)景。