HashMap與ConcurrentHashMap的區(qū)別
在Java編程語(yǔ)言中,最基本的結(jié)構(gòu)就是兩種,一個(gè)是數(shù)組,另外一個(gè)是模擬指針(引用),所有的數(shù)據(jù)結(jié)構(gòu)都可以用這兩個(gè)基本結(jié)構(gòu)來(lái)構(gòu)造的,HashMap也不例外。
1. HashMap實(shí)際上是一個(gè)“鏈表的數(shù)組”的數(shù)據(jù)結(jié)構(gòu),每個(gè)元素存放鏈表頭結(jié)點(diǎn)的數(shù)組,即數(shù)組和鏈表的結(jié)合體。HashMap底層就是一個(gè)數(shù)組,數(shù)組中的每一項(xiàng)又是一個(gè)鏈表。當(dāng)新建一個(gè)HashMap的時(shí)候,就會(huì)初始化一個(gè)數(shù)組。
2. ConcurrentHashMap是由Segment數(shù)組結(jié)構(gòu)和HashEntry數(shù)組結(jié)構(gòu)組成。Segment是一種可重入鎖ReentrantLock,在ConcurrentHashMap里扮演鎖的角色,HashEntry則用于存儲(chǔ)鍵值對(duì)數(shù)據(jù)。
3. 一個(gè)ConcurrentHashMap里包含一個(gè)Segment數(shù)組,Segment的結(jié)構(gòu)和HashMap類(lèi)似,是一種數(shù)組和鏈表結(jié)構(gòu), 一個(gè)Segment里包含一個(gè)HashEntry數(shù)組。
4. 每個(gè)HashEntry是一個(gè)鏈表結(jié)構(gòu)的元素, 每個(gè)Segment守護(hù)者一個(gè)HashEntry數(shù)組里的元素,當(dāng)對(duì)HashEntry數(shù)組的數(shù)據(jù)進(jìn)行修改時(shí),必須首先獲得它對(duì)應(yīng)的Segment鎖。
ArrayList 與 LinkedList有什么區(qū)別?
因?yàn)?Array 是基于索引(index)的數(shù)據(jù)結(jié)構(gòu),它使用索引在數(shù)組中搜索和讀取數(shù)據(jù)是很快的。Array 獲取數(shù)據(jù)的時(shí)間復(fù)雜度是 O(1),但是要?jiǎng)h除數(shù)據(jù)卻是開(kāi)銷(xiāo)很大的,因?yàn)檫@需要重排數(shù)組中的所有數(shù)據(jù)。
相對(duì)于 ArrayList,LinkedList 插入是更快的。因?yàn)?LinkedList 不像 ArrayList 一樣,不需要改變數(shù)組的大小,也不需要在數(shù)組裝滿(mǎn)的時(shí)候要將所有的數(shù)據(jù)重新裝入一個(gè)新的數(shù)組,這是 ArrayList 最壞的一種情況,時(shí)間復(fù)雜度是 O(n),而 LinkedList 中插入或刪除的時(shí)間復(fù)雜度僅為 O(1)。ArrayList 在插入數(shù)據(jù)時(shí)還需要更新索引(除了插入數(shù)組的尾部)。
類(lèi)似于插入數(shù)據(jù),刪除數(shù)據(jù)時(shí),LinkedList 也優(yōu)于 ArrayList。
LinkedList 需要更多的內(nèi)存,因?yàn)?ArrayList 的每個(gè)索引的位置是實(shí)際的數(shù)據(jù),而 LinkedList 中的每個(gè)節(jié)點(diǎn)中存儲(chǔ)的是實(shí)際的數(shù)據(jù)和前后節(jié)點(diǎn)的位置。
如果你的應(yīng)用經(jīng)常需要隨機(jī)訪(fǎng)問(wèn)數(shù)據(jù),則考慮使用ArrayList。因?yàn)槿绻枰狶inkedList 中的第 n 個(gè)元素的時(shí)候,你需要從第一個(gè)元素順序數(shù)到第 n 個(gè)數(shù)據(jù),然后讀取數(shù)據(jù)。
你的應(yīng)用經(jīng)常進(jìn)行插入和刪除元素,更少的讀取數(shù)據(jù),考慮使用LinkedList。因?yàn)椴迦牒蛣h除元素不涉及重排數(shù)據(jù),所以它要比 ArrayList 要快。
更多關(guān)于“Java培訓(xùn)”的問(wèn)題,歡迎咨詢(xún)千鋒教育在線(xiàn)名師。千鋒已有十余年的培訓(xùn)經(jīng)驗(yàn),課程大綱更科學(xué)更專(zhuān)業(yè),有針對(duì)零基礎(chǔ)的就業(yè)班,有針對(duì)想提升技術(shù)的好程序員班,高品質(zhì)課程助力你實(shí)現(xiàn)java程序員夢(mèng)想。