HashMap、HashSet、TreeMap面試
一、HashMap
1.HashMap是基於 雜湊表的 Map介面的 非同步 實現。此實現提供所有可選的對映操作,
2.並允許使用null值和null鍵(HashMap最多隻允許一條記錄的鍵為null,允許多條記錄的值為null。)。
3.此類不保證對映的順序,特別是它不保證該順序恆久不變。
4.HashMap中不允許出現重複的鍵(Key)
5.Hashmap是非執行緒安全的,如果多個執行緒同時訪問一個HashMap,可能會導致資料不一致,所以當其中至少一個執行緒從結構上(指新增或者刪除一個或多個對映關係的任何操作)修改了,則必須保持外部同步,以防止對對映進行意外的非同步訪問。
6.其迭代器是fail-fast的
7.HashMap實際上是一個“連結串列雜湊”的資料結構,即陣列和連結串列的結合體,(JDK1.8增加了紅黑樹部分,會將時間複雜度從O(n)降為O(logn))。
紅黑樹 即使負載因子和Hash演算法設計的再合理,也免不了會出現拉鍊過長的情況,一旦出現拉鍊過長,則會嚴重影響HashMap的效能。於是,在JDK1.8版本中,對資料結構做了進一步的優化,引入了紅黑樹。而當連結串列長度太長(預設超過8)時,連結串列就轉換為紅黑樹,利用紅黑樹快速增刪改查的特點提高HashMap的效能,其中會用到紅黑樹的插入、刪除、查詢等演算法。
二、HashSet
HashSet中的資料不是key-value鍵值對,其只是單值,雖然其藉助與HashMap來實現,但是其只是將值作為key來存入HashMap中,因為HashMap中的值是key-value鍵值對的,所以每個HashSet儲存到HashMap的資料對應的value值只是一個new Object()物件,
三、TreeMap
TreeMap 是一個有序的key-value集合,它是通過紅黑樹實現的。 TreeMap 繼承於AbstractMap,所以它是一個Map,即一個key-value集合。 TreeMap 實現了NavigableMap介面,意味著它支援一系列的導航方法。比如返回有序的key集合。 TreeMap 實現了Cloneable介面,意味著它能被克隆。
TreeMap基於紅黑樹(Red-Black tree)實現。該對映根據其鍵的自然順序(字母排序)進行排序,或者根據建立對映時提供的 Comparator 進行排序,具體取決於使用的構造方法。 TreeMap的基本操作 containsKey、get、put 和 remove 的時間複雜度是 log(n)
HashMap | TreeMap |
---|---|
遍歷出來資料無序 | 自然排序或者建立對映提供的Comparator 進行排序 |
基於散列表 | 紅黑樹 |
取值速度快 | 取值速度慢 |
適用於在Map中插入、刪除和定位元素 | 適用於按自然順序或自定義順序遍歷鍵(key) |