java自定义键值对_KV键值对数据类型
類關系圖
### 常用接口及實現類
* Map
* Dictionary
* HashMap
* Hashtable
* LinkedHashMap
* SortedMap
* TreeMap
* WeakHashMap
* EnumMap
下面針對各個實現類的特點做一些說明:
\(1\) HashMap:它根據鍵的hashCode值存儲數據,大多數情況下可以直接定位到它的值,因而具有很快的訪問速度,但遍歷順序卻是不確定的。 HashMap最多只允許一條記錄的鍵為null,允許多條記錄的值為null。HashMap非線程安全,即任一時刻可以有多個線程同時寫HashMap,可能會導致數據的不一致。如果需要滿足線程安全,可以用 Collections的synchronizedMap方法使HashMap具有線程安全的能力,或者使用ConcurrentHashMap。
\(2\) Hashtable:Hashtable是遺留類,很多映射的常用功能與HashMap類似,不同的是它承自Dictionary類,并且是線程安全的,任一時間只有一個線程能寫Hashtable,并發性不如ConcurrentHashMap,因為ConcurrentHashMap引入了分段鎖。Hashtable不建議在新代碼中使用,不需要線程安全的場合可以用HashMap替換,需要線程安全的場合可以用ConcurrentHashMap替換。
\(3\) LinkedHashMap:LinkedHashMap是HashMap的一個子類,保存了記錄的插入順序,在用Iterator遍歷LinkedHashMap時,先得到的記錄肯定是先插入的,也可以在構造時帶參數,按照訪問次序排序。
\(4\) TreeMap:TreeMap實現SortedMap接口,能夠把它保存的記錄根據鍵排序,默認是按鍵值的升序排序,也可以指定排序的比較器,當用Iterator遍歷TreeMap時,得到的記錄是排過序的。如果使用排序的映射,建議使用TreeMap。在使用TreeMap時,key必須實現Comparable接口或者在構造TreeMap傳入自定義的Comparator,否則會在運行時拋出java.lang.ClassCastException類型的異常。
對于上述四種Map類型的類,要求映射中的key是不可變對象。不可變對象是該對象在創建后它的哈希值不會被改變。如果對象的哈希值發生變化,Map對象很可能就定位不到映射的位置了。
通過上面的比較,我們知道了HashMap是Java的Map家族中一個普通成員,鑒于它可以滿足大多數場景的使用條件,所以是使用頻度最高的一個。下文我們主要結合源碼,從存儲結構、常用方法分析、擴容以及安全性等方面深入講解HashMap的工作原理。
### Map集合類對null的支持
|集合類 | key | value | super | 說明 |
| :---: | :---: |:---: |:---: | ---: |
| Hashtable | 不允許null |不允許null | Dictionary | 線程安全|
| ConcurrentHashMap | 不允許null | 不允許null| AbstractMap|鎖分段技術(JDK8:CAS) |
| TreeMap | 不允許null | 允許null | AbstractMap | 線程不安全|
| HashMap | 運行為null |運行為null| AbstractMap| 線程不安全|
【參考資料】
【美團公眾號】 -- [https://tech.meituan.com/java-hashmap.html](https://tech.meituan.com/java-hashmap.html)
總結
以上是生活随笔為你收集整理的java自定义键值对_KV键值对数据类型的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java的object有show_Jav
- 下一篇: java生成apk工具,生成并运行apk