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