java集合——Map

Map不由Collection接口派生站辉,Map提供key到value的映射唁毒。一個Map中不能包含相同的key蘑辑,每個key只能映射一個 value。與Map接口相關(guān)的部分UML類圖如下:

其具體實現(xiàn)類主要有:HashMap浇冰、LinkedHashMap贬媒、TreeMap、HashTable肘习。

HashMap

1际乘、允許null鍵/值。
2漂佩、非線程安全脖含。
3、不保證有序(比如插入的順序)仅仆、也不保證序不隨時間變化器赞。

LinkedHashMap

1垢袱、LinkedHashMap是基于HashMap實現(xiàn)的墓拜,它繼承了HashMap。
2请契、內(nèi)部節(jié)點(diǎn)是雙向的咳榜,從而保證了迭代順序是插入的順序夏醉;如果accessOrder為true,則維護(hù)了最近訪問的順序涌韩。
3畔柔、LinkedHashMap會在節(jié)點(diǎn)插入、節(jié)點(diǎn)訪問臣樱、節(jié)點(diǎn)移除后做一些事情靶擦,即更新鏈表,把最近訪問的放到最后雇毫。

TreeMap

1玄捕、通過Comparator對象,來保持我們想要維護(hù)的key的大小順序棚放。
2枚粘、使用平衡二叉樹——紅黑樹來存儲元素,紅黑樹的特性決定了它的查詢飘蚯、插入馍迄、刪除操作的時間復(fù)雜度均為O(log n)。

HashTable

1局骤、Hashtable不允許key或者value使用null值攀圈。
2、Hashtable的大部分方法做了同步峦甩,因此是線程安全的量承。
3、key的hash算法以及index的計算方法跟HashMap不同穴店。

同步問題

1撕捍、HashMap、LinkedHashMap泣洞、TreeMap都是非線程安全的忧风,如果在多線程中使用,可以通過 Collections.synchronizedMap(Map<K,V> m) 來實現(xiàn)線程安全球凰,其內(nèi)部是通過 synchronized 關(guān)鍵字來修飾方法來達(dá)到同步的目的狮腿。

2、HashMap 提供了對應(yīng)的 ConcurrentHashMap 這個線程安全的類呕诉,重要通過以下三個方面來達(dá)到高并發(fā)的目的(參考):

1缘厢、用分離鎖實現(xiàn)多個線程間的更深層次的共享訪問。

  • 在 ConcurrentHashMap 中甩挫,線程對映射表做讀操作時贴硫,一般情況下不需要加鎖就可以完成,對容器做結(jié)構(gòu)性修改的操作才需要加鎖。
  • 使用 Segment 類(繼承于 ReentrantLock 類)英遭,加鎖操作是針對(鍵的 hash 值對應(yīng)的)某個具體的 Segment间护,鎖定的是該 Segment 而不是整個 ConcurrentHashMap。因為插入鍵 / 值對操作只是在這個 Segment 包含的某個桶中完成挖诸,不需要鎖定整個ConcurrentHashMap汁尺。此時,其他寫線程對另外 15 個Segment 的加鎖并不會因為當(dāng)前線程對這個 Segment 的加鎖而阻塞多律。同時痴突,所有讀線程幾乎不會因本線程的加鎖而阻塞(除非讀線程剛好讀到這個 Segment 中某個 HashEntry 的 value 域的值為 null,此時需要加鎖后重新讀取該值)狼荞。

2苞也、用 HashEntery 對象的不變性來降低執(zhí)行讀操作的線程在遍歷鏈表期間對加鎖的需求。

3粘秆、通過對同一個 Volatile 變量的寫 / 讀訪問如迟,協(xié)調(diào)不同線程間讀 / 寫操作的內(nèi)存可見性。(在 value 字段添加 volatile 修飾符)

通過減小請求同一個鎖的頻率和盡量減少持有鎖的時間 攻走,使得 ConcurrentHashMap 的并發(fā)性相對于 HashTable 和用同步包裝器包裝的 HashMap有了質(zhì)的提高殷勘,so,優(yōu)先使用 ConcurrentHashMap昔搂。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末玲销,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子摘符,更是在濱河造成了極大的恐慌贤斜,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,651評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件逛裤,死亡現(xiàn)場離奇詭異瘩绒,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)带族,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,468評論 3 392
  • 文/潘曉璐 我一進(jìn)店門锁荔,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人蝙砌,你說我怎么就攤上這事阳堕。” “怎么了择克?”我有些...
    開封第一講書人閱讀 162,931評論 0 353
  • 文/不壞的土叔 我叫張陵恬总,是天一觀的道長。 經(jīng)常有香客問我肚邢,道長壹堰,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,218評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮缀旁,結(jié)果婚禮上记劈,老公的妹妹穿的比我還像新娘勺鸦。我一直安慰自己并巍,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,234評論 6 388
  • 文/花漫 我一把揭開白布换途。 她就那樣靜靜地躺著懊渡,像睡著了一般。 火紅的嫁衣襯著肌膚如雪军拟。 梳的紋絲不亂的頭發(fā)上剃执,一...
    開封第一講書人閱讀 51,198評論 1 299
  • 那天,我揣著相機(jī)與錄音懈息,去河邊找鬼肾档。 笑死,一個胖子當(dāng)著我的面吹牛辫继,可吹牛的內(nèi)容都是我干的怒见。 我是一名探鬼主播,決...
    沈念sama閱讀 40,084評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼姑宽,長吁一口氣:“原來是場噩夢啊……” “哼遣耍!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起炮车,我...
    開封第一講書人閱讀 38,926評論 0 274
  • 序言:老撾萬榮一對情侶失蹤舵变,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后瘦穆,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體纪隙,經(jīng)...
    沈念sama閱讀 45,341評論 1 311
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,563評論 2 333
  • 正文 我和宋清朗相戀三年扛或,在試婚紗的時候發(fā)現(xiàn)自己被綠了瘫拣。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,731評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡告喊,死狀恐怖麸拄,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情黔姜,我是刑警寧澤拢切,帶...
    沈念sama閱讀 35,430評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站秆吵,受9級特大地震影響淮椰,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,036評論 3 326
  • 文/蒙蒙 一主穗、第九天 我趴在偏房一處隱蔽的房頂上張望泻拦。 院中可真熱鬧,春花似錦忽媒、人聲如沸争拐。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,676評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽架曹。三九已至,卻和暖如春闹瞧,著一層夾襖步出監(jiān)牢的瞬間绑雄,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,829評論 1 269
  • 我被黑心中介騙來泰國打工奥邮, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留万牺,地道東北人。 一個月前我還...
    沈念sama閱讀 47,743評論 2 368
  • 正文 我出身青樓洽腺,卻偏偏與公主長得像脚粟,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子已脓,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,629評論 2 354

推薦閱讀更多精彩內(nèi)容