JAVA容器相關(guān)知識(shí)點(diǎn)整理

簡(jiǎn)介

  1. 整理容器的基本知識(shí)
  2. 整理關(guān)于不同容器線程安全方面的知識(shí)

根據(jù)以下資料整理

http://www.reibang.com/p/047e33fdefd2
http://blog.csdn.net/jiyiqinlovexx/article/details/51030720

常用容器關(guān)系圖

快速了解


Collection(接口)
  1. 代表的是單個(gè)元素對(duì)象的序列嫂侍,(可以有序/無(wú)序,可重復(fù)/不可重復(fù) 等雕拼,具體依據(jù)具體的子接口Set扬霜,List,Queue等)稿存;
  2. 調(diào)用toArray(T[] a)可以轉(zhuǎn)為數(shù)組
  3. 區(qū)別于java.util.Collections:Collections是一個(gè)正對(duì)于Conllection的工具類笨篷,提供了許多實(shí)用的靜態(tài)方法
Map(接口)
  1. 代表的是“鍵值對(duì)”對(duì)象的集合(同樣可以有序/無(wú)序 等依據(jù)具體實(shí)現(xiàn))
  2. 提供了三種遍歷方式:
  3. Set<K> keySet(): 返回所有key的Set集合
  4. Collection<V> values(): 返回所有values的集合
  5. Set< Map.Entry< K, V>> entrySet(): 是將整個(gè)Entry對(duì)象(也就是返回鍵-值形式的集合)作為元素返回所有的數(shù)據(jù),這種方式比先通過(guò)keySet()獲取所有key再根據(jù)key獲取值效率要高

List(Collection的子接口)
  1. 一個(gè)有序的Collection(或者叫做序列)瓣履。使用這個(gè)接口可以精確掌控元素的插入率翅,還可以根據(jù)index獲取相應(yīng)位置的元素。
  2. 可重復(fù)
  3. 有順序
  4. 提供了特殊的iterator遍歷器袖迎,叫做ListIterator冕臭。這種遍歷器允許遍歷時(shí)插入,替換燕锥,刪除辜贵,雙向訪問(wèn)。 并且還有一個(gè)重載方法允許從一個(gè)指定位置開始遍歷归形。
ArrayList(List接口的實(shí)現(xiàn))
  1. ArrayList是一個(gè)實(shí)現(xiàn)了List接口的可變數(shù)組
  2. 可以插入null
  3. 它的size, isEmpty, get, set, iterator,add這些方法的時(shí)間復(fù)雜度是O(1),如果add n個(gè)數(shù)據(jù)則時(shí)間復(fù)雜度是O(n).
  4. ArrayList不是synchronized的托慨。
LinkedList(List接口的實(shí)現(xiàn))
  1. LinkedList是一個(gè)鏈表維護(hù)的序列容器。和ArrayList都是序列容器暇榴,一個(gè)使用數(shù)組存儲(chǔ)厚棵,一個(gè)使用鏈表存儲(chǔ)蕉世。
  2. 數(shù)組和鏈表2種數(shù)據(jù)結(jié)構(gòu)的對(duì)比:
  3. 查找方面。數(shù)組的效率更高婆硬,可以直接索引出查找讨彼,而鏈表必須從頭查找。
  4. 插入刪除方面柿祈。特別是在中間進(jìn)行插入刪除哈误,這時(shí)候鏈表體現(xiàn)出了極大的便利性,只需要在插入或者刪除的地方斷掉鏈然后插入或者移除元素躏嚎,然后再將前后鏈重新組裝蜜自,但是數(shù)組必須重新復(fù)制一份將所有數(shù)據(jù)后移或者前移。
  5. 在內(nèi)存申請(qǐng)方面卢佣,當(dāng)數(shù)組達(dá)到初始的申請(qǐng)長(zhǎng)度后重荠,需要重新申請(qǐng)一個(gè)更大的數(shù)組然后把數(shù)據(jù)遷移過(guò)去才行(所以當(dāng)創(chuàng)建ArrayList,最好能給一個(gè)合理的初始大小)虚茶。而鏈表只需要?jiǎng)討B(tài)創(chuàng)建即可戈鲁。
  6. LinkedList還實(shí)現(xiàn)了Deque接口,Deque接口是繼承Queue的嘹叫。所以LinkedList還支持隊(duì)列的pop婆殿,push,peek操作
mark
Set(Collection的子接口)
  1. 存儲(chǔ)不重復(fù)的元素集合
HashSet(Set接口的實(shí)現(xiàn))
  1. 基于HashMap進(jìn)行存儲(chǔ)(所以所有的add罩扇,remove等操作其實(shí)都是HashMap的add婆芦、remove操作。遍歷操作其實(shí)就是HashMap的keySet的遍歷)
  2. 不保證順序喂饥,且不保證下次遍歷的順序和之前一樣
  3. 允許null元素
LinkedHashSet(Set接口的實(shí)現(xiàn))
  1. 基于LinkedHashMap
  2. 相對(duì)于HashSet來(lái)說(shuō)就是一個(gè)可以保持順序的Set集合
TreeSet(Set接口的實(shí)現(xiàn))
  1. 基于TreeMap
  2. TreeSet內(nèi)的元素必須實(shí)現(xiàn)Comparable接口
  3. 一組有次序的集合消约,如果沒(méi)有指定排序規(guī)則Comparator,則會(huì)按照自然排序员帮。(自然排序即e1.compareTo(e2) == 0作為比較)
mark
Queue(Collection的子接口)
Map
HashMap
  1. 最基礎(chǔ)最常用的一種Map或粮,它無(wú)序,以散列表的方式進(jìn)行存儲(chǔ)
LinkedHashMap
  1. 相對(duì)于HashMap來(lái)說(shuō)區(qū)別是捞高,LinkedHashMap遍歷的時(shí)候具有順序氯材,可以保存插入的順序,(還可以設(shè)置最近訪問(wèn)的元素也放在前面棠枉,即LRU)
  2. 其實(shí)LinkedHashMap的存儲(chǔ)還是跟HashMap一樣浓体,采用哈希表方法存儲(chǔ)泡挺,只不過(guò)LinkedHashMap多維護(hù)了一份head辈讶,tail鏈表。
TreeMap
  1. TreeMap平時(shí)用的不多娄猫,TreeMap會(huì)實(shí)現(xiàn)SortMap接口贱除,定義一個(gè)排序規(guī)則生闲,這樣當(dāng)遍歷TreeMap的時(shí)候,會(huì)根據(jù)規(guī)定的排序規(guī)則返回元素月幌。
WeakHashMap
  1. 特點(diǎn)是碍讯,當(dāng)除了自身有對(duì)key的引用外,此key沒(méi)有其他引用那么此map會(huì)自動(dòng)丟棄此值
mark

以上扯躺,感謝http://www.reibang.com/p/047e33fdefd2 捉兴,如有冒犯,請(qǐng)聯(lián)系我刪除


關(guān)于容器的線程安全

同步容器類

JDK1.0開始有兩個(gè)很老的同步容器類:Vector和HashTable
JDK1.2之后Collections工具類中添加了一些工廠方法返回類似的同步封裝器類:
Collections.synchronizedXXX(XXX xxx)

實(shí)現(xiàn)方式:

將它們的狀態(tài)封裝起來(lái)录语,并對(duì)每一個(gè)公有方法進(jìn)行同步倍啥。
其中Vector就是Object[]+synchronized方法,Hashtable是HashtableEntry[]+synchronized方法澎埠。而synchronizedXXX()方法返回的同步封裝器類更是簡(jiǎn)單地將傳進(jìn)來(lái)的Collection的所有方法封裝為synchronized方法而已虽缕。

缺點(diǎn):
  1. 通過(guò)同步方法將訪問(wèn)操作串行化,導(dǎo)致并發(fā)環(huán)境下效率低下
  1. 復(fù)合操作(迭代蒲稳、條件運(yùn)算如沒(méi)有則添加等)非線程安全氮趋,需要客戶端代碼來(lái)實(shí)現(xiàn)加鎖。
并發(fā)容器類

并發(fā)容器出現(xiàn)的最大的需求就是提升同步容器類的性能江耀!
可以對(duì)比(非并發(fā)容器類)看看剩胁,將單線程版本和并發(fā)版本做一個(gè)比較。

HashMap和HashSet的并發(fā)版本
  1. ConcurrentHashMap<K, V>(HashMap的并發(fā)版本)
    版本:JDK5
    目標(biāo):代替Hashtable祥国、synchronizedMap摧冀,支持復(fù)合操作
    原理:采用一種更加細(xì)粒度的加鎖機(jī)制“分段鎖”,任意數(shù)量讀取線程可以并發(fā)讀取系宫,任意數(shù)量的讀取線程和一個(gè)寫線程可以并發(fā)訪問(wèn)索昂,一定數(shù)量的寫入線程可以并發(fā)訪問(wèn)。并發(fā)環(huán)境下ConcurrentHashMap帶來(lái)了更高的吞吐量扩借,而在單線程環(huán)境下只損失了很小的性能椒惨。

  2. CopyOnWriteArraySet<E>(HashSet的并發(fā)版本)
    版本:JDK5
    目標(biāo):代替synchronizedSet
    原理:CopyOnWriteArraySet基于CopyOnWriteArrayList實(shí)現(xiàn),其唯一的不同是在add時(shí)調(diào)用的是CopyOnWriteArrayList的addIfAbsent方法潮罪,其遍歷當(dāng)前Object數(shù)組康谆,如Object數(shù)組中已有了當(dāng)前元素,則直接返回嫉到,如果沒(méi)有則放入Object數(shù)組的尾部沃暗,并返回。

TreeMap和TreeSet的并發(fā)版本
  1. ConcurrentSkipListMap<K, V>(TreeMap的并發(fā)版本)
    版本:JDK6
    目標(biāo):代替synchronizedSortedMap(TreeMap)
    原理:Skip list(跳表)是一種可以代替平衡樹的數(shù)據(jù)結(jié)構(gòu)何恶,默認(rèn)是按照Key值升序的孽锥。Skip list讓已排序的數(shù)據(jù)分布在多層鏈表中,以0-1隨機(jī)數(shù)決定一個(gè)數(shù)據(jù)的向上攀升與否,通過(guò)"空間來(lái)?yè)Q取時(shí)間"的一個(gè)算法惜辑。ConcurrentSkipListMap提供了一種線程安全的并發(fā)訪問(wèn)的排序映射表唬涧。內(nèi)部是SkipList(跳表)結(jié)構(gòu)實(shí)現(xiàn),在理論上能夠在O(log(n))時(shí)間內(nèi)完成查找盛撑、插入碎节、刪除操作。

  2. ConcurrentSkipListSet<E>(TreeSet的并發(fā)版本)
    版本:JDK6
    目標(biāo):代替synchronizedSortedSet
    原理:內(nèi)部基于ConcurrentSkipListMap實(shí)現(xiàn)抵卫!

ArrayList和LinkedList的并發(fā)版本
  1. CopyOnWriteArrayList<E>(ArrayList的并發(fā)版本)
    目標(biāo):代替Vector狮荔、synchronizedList
    原理:CopyOnWriteArrayList的核心思想是利用高并發(fā)往往是讀多寫少的特性,對(duì)讀操作不加鎖介粘,對(duì)寫操作轴合,先復(fù)制一份新的集合,在新的集合上面修改碗短,然后將新集合賦值給舊的引用受葛,并通過(guò)volatile 保證其可見性,當(dāng)然寫操作的鎖是必不可少的了偎谁。

  2. ConcurrentLinkedQueue<E>(LinkedList的并發(fā)版本)
    目標(biāo):代替Vector总滩、synchronizedList
    特點(diǎn):基于鏈表實(shí)現(xiàn)的FIFO隊(duì)列,特別注意單線程環(huán)境中LinkedList除了可以用作鏈表巡雨,也可用作隊(duì)列闰渔,并發(fā)版本也一樣

阻塞隊(duì)列:BlockingQueue

版本:JDK1.5
特點(diǎn):拓展了Queue,增加了可阻塞的插入和獲取等操作
實(shí)現(xiàn)類
LinkedBlockingQueue:基于鏈表實(shí)現(xiàn)的可阻塞的FIFO隊(duì)列
ArrayBlockingQueue:基于數(shù)組實(shí)現(xiàn)的可阻塞的FIFO隊(duì)列
PriorityBlockingQueue:按優(yōu)先級(jí)排序的隊(duì)列
原理:通過(guò)ReentrantLock實(shí)現(xiàn)線程安全铐望,通過(guò)Condition實(shí)現(xiàn)阻塞和喚醒冈涧。

以上,感謝http://blog.csdn.net/jiyiqinlovexx/article/details/51030720 正蛙,如有冒犯督弓,請(qǐng)聯(lián)系我刪除

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市乒验,隨后出現(xiàn)的幾起案子愚隧,更是在濱河造成了極大的恐慌,老刑警劉巖锻全,帶你破解...
    沈念sama閱讀 207,113評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件狂塘,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡鳄厌,警方通過(guò)查閱死者的電腦和手機(jī)荞胡,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)了嚎,“玉大人泪漂,你說(shuō)我怎么就攤上這事。” “怎么了窖梁?”我有些...
    開封第一講書人閱讀 153,340評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵赘风,是天一觀的道長(zhǎng)夹囚。 經(jīng)常有香客問(wèn)我纵刘,道長(zhǎng),這世上最難降的妖魔是什么荸哟? 我笑而不...
    開封第一講書人閱讀 55,449評(píng)論 1 279
  • 正文 為了忘掉前任假哎,我火速辦了婚禮,結(jié)果婚禮上鞍历,老公的妹妹穿的比我還像新娘舵抹。我一直安慰自己,他們只是感情好劣砍,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,445評(píng)論 5 374
  • 文/花漫 我一把揭開白布惧蛹。 她就那樣靜靜地躺著,像睡著了一般刑枝。 火紅的嫁衣襯著肌膚如雪香嗓。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,166評(píng)論 1 284
  • 那天装畅,我揣著相機(jī)與錄音靠娱,去河邊找鬼。 笑死掠兄,一個(gè)胖子當(dāng)著我的面吹牛像云,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播蚂夕,決...
    沈念sama閱讀 38,442評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼迅诬,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了婿牍?” 一聲冷哼從身側(cè)響起百框,我...
    開封第一講書人閱讀 37,105評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎牍汹,沒(méi)想到半個(gè)月后铐维,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,601評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡慎菲,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,066評(píng)論 2 325
  • 正文 我和宋清朗相戀三年嫁蛇,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片露该。...
    茶點(diǎn)故事閱讀 38,161評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡睬棚,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情抑党,我是刑警寧澤包警,帶...
    沈念sama閱讀 33,792評(píng)論 4 323
  • 正文 年R本政府宣布,位于F島的核電站底靠,受9級(jí)特大地震影響害晦,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜暑中,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,351評(píng)論 3 307
  • 文/蒙蒙 一壹瘟、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧鳄逾,春花似錦稻轨、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至枚抵,卻和暖如春线欲,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背俄精。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評(píng)論 1 261
  • 我被黑心中介騙來(lái)泰國(guó)打工询筏, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人竖慧。 一個(gè)月前我還...
    沈念sama閱讀 45,618評(píng)論 2 355
  • 正文 我出身青樓嫌套,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親圾旨。 傳聞我的和親對(duì)象是個(gè)殘疾皇子踱讨,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,916評(píng)論 2 344

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

  • Java SE 基礎(chǔ): 封裝、繼承砍的、多態(tài) 封裝: 概念:就是把對(duì)象的屬性和操作(或服務(wù))結(jié)合為一個(gè)獨(dú)立的整體痹筛,并盡...
    Jayden_Cao閱讀 2,099評(píng)論 0 8
  • java基礎(chǔ) 集合承繼包含圖 Collection vs Collections 首先,"Collection" ...
    onlyHalfSoul閱讀 1,299評(píng)論 0 5
  • Java集合類可用于存儲(chǔ)數(shù)量不等的對(duì)象,并可以實(shí)現(xiàn)常用的數(shù)據(jù)結(jié)構(gòu)如棧,隊(duì)列等,Java集合還可以用于保存具有映射關(guān)...
    小徐andorid閱讀 1,918評(píng)論 0 13
  • List: 1.可以允許重復(fù)的對(duì)象廓鞠。 2.可以插入多個(gè)null元素帚稠。 3.是一個(gè)有序容器,保持了每個(gè)元素的插入順序...
    雪飄千里閱讀 185評(píng)論 0 1
  • 本系列出于AWeiLoveAndroid的分享床佳,在此感謝滋早,再結(jié)合自身經(jīng)驗(yàn)查漏補(bǔ)缺,完善答案砌们。以成系統(tǒng)杆麸。 Java基...
    濟(jì)公大將閱讀 1,524評(píng)論 1 6