前面花了4章對HashMap、LinkedHashMap以及TreeMap的原理實現進行了講解,本章對它們進行簡單的對比分析。
這里簡單提一下,為什么前面沒有單獨一章來講HashTable,HashTable是基於陳舊的Dictionary來實現的,效率上比起HashMap差很多,同時其唯一的優勢“線程安全”的實現機制效率也是非常差的,現在一般都用ConcurrentHashMap,所以這個類基本上已經算是廢棄了。
下面通過一個表格從各方面對比分析HashMap、LinkedHashMap、TreeMap
HashMap | LinkedHashMap | TreeMap | |
---|---|---|---|
原理 | HashMap擴容機制及存取原理 | LinkedHashMap如何保證順序性 | TreeMap原理實現及常用方法 |
線程安全 | 否 | 否 | 否 |
初始容量 | 16 | 16 | 0 |
存儲結構 | 數組+鏈表/紅黑樹 | 數組+鏈表/紅黑樹,HashMap子類 | 紅黑樹 |
順序規則 | 取值無順序 | 取值按插入的順序/按修改的順序,根據accessOrder控制 | 插入時按key的自然順序或者自定義順序 |
存儲特點 | 最多一條記錄的key為null,可以多條記錄value為null | 最多一條記錄的key為null,可以多條記錄value為null | 當為key的自然順序存儲時key不能為null,當自定義順序時,通過傳入的Comparator的實現控制 |
插入效率 | 高 | 高 | 較高(因為需要不斷Compare比較) |
遍歷效率 | 高 | 較高(遍歷后會改變存儲順序) | 較高 |
使用場景 | 使用最多,絕大多數無需排序的情況都可使用 | 需要插入的順序和取出的順序一樣的情況下 | 需要按照key的自然順序甚至於自定義順序的情況下 |
使用場景舉例 | - | 如我們對領導進行排名,對城市的經濟發展進行排名等 | 如我們要展示周一到周五的消費情況,數據庫里只取到了周二、周五的消費統計數據,這時將數據庫的統計數據和手動構建消費為0的周一、三、五的數據按順序組裝,這時用TreeMap會非常方便 |
總結:
本文從線程安全、初始容量、存儲結構、順序規則、存儲特點、插入效率、遍歷效率、使用場景及舉例。另外:前面提到的插入效率和遍歷效率的高、較高都是在大數量的情況下,當數據量少的情況下基本沒有區別,若有不對之處,請批評指正,望共同進步,謝謝!