Java集合

一艰额、List澄港、Set、Map的區(qū)別柄沮。

List:

1. 可以有重復(fù)的對(duì)象慢睡。

2. 允許存放多個(gè)null元素。

3. 有序铡溪,保證了每個(gè)元素的插入順序漂辐。

4. 常用的實(shí)現(xiàn)類有?ArrayList、LinkedList 和 Vector棕硫。ArrayList 最為流行髓涯,它提供了使用索引的隨意訪問,而 LinkedList 則對(duì)于經(jīng)常需要從 List 中添加或刪除元素的場(chǎng)合更為合適哈扮,Vector是線程同步的纬纪。

Set:

1. 不允許重復(fù)對(duì)象

2. 只允許一個(gè)null元素

3. 無(wú)序,無(wú)法保證每個(gè)元素的存儲(chǔ)順序滑肉。

4.?常用的實(shí)現(xiàn)類有HashSet包各、LinkedHashSet 以及 TreeSet。最流行的是基于 HashMap 實(shí)現(xiàn)的 HashSet靶庙;TreeSet 還實(shí)現(xiàn)了 SortedSet 接口问畅,因此 TreeSet 是一個(gè)根據(jù)其 compare() 和 compareTo() 的定義進(jìn)行排序的有序容器(TreeSet不允許null值,因?yàn)楸容^時(shí)會(huì)出現(xiàn)空指針異常)六荒。LinkedHashSet使用LinkedList維護(hù)了插入元素的先后順序护姆。

Map:

1. Map不是Collection的一個(gè)子接口或?qū)崿F(xiàn)類,它是一個(gè)接口掏击。

2. Map的每個(gè)Entry都持有兩個(gè)對(duì)象卵皂,分別是鍵和值,Map可能會(huì)有相同的值對(duì)象砚亭,但鍵對(duì)象是唯一的灯变。

3. ThreeMap通過(guò)Comparator或Comparable維護(hù)了一個(gè)排序順序。

4. Map里可以有多個(gè)null值捅膘,但只能由一個(gè)null鍵

5. Map 接口最流行的幾個(gè)實(shí)現(xiàn)類是 HashMap添祸、LinkedHashMap、Hashtable 和 TreeMap篓跛。(HashMap膝捞、TreeMap最常用)


參考:List、Set愧沟、Map的區(qū)別


二蔬咬、ArrayList、LinkedList沐寺、Vector的區(qū)別林艘。

1. ArrayList是最常用的,內(nèi)部是通過(guò)數(shù)組實(shí)現(xiàn)混坞,它允許對(duì)子元素快速隨機(jī)訪問狐援。數(shù)組的存儲(chǔ)空間是連續(xù)的,所以當(dāng)數(shù)組大小不足以滿足存儲(chǔ)需求時(shí)究孕,就要將已有數(shù)組的數(shù)據(jù)復(fù)制到新的數(shù)組中啥酱。當(dāng)從數(shù)組中插入,刪除元素時(shí)厨诸,需要對(duì)數(shù)組進(jìn)行復(fù)制镶殷、移動(dòng),代價(jià)較高微酬。因此绘趋,它適合隨機(jī)查找和遍歷,不適合插入和刪除颗管。

2. Vector和ArrayList一樣是通過(guò)數(shù)組實(shí)現(xiàn)的陷遮,不同的是Vector支持線程的同步。實(shí)現(xiàn)線程的同步需要很高的花費(fèi)垦江,因此帽馋,訪問它比訪問ArrayList慢。

3. LinkedList是用鏈表來(lái)存儲(chǔ)數(shù)據(jù)的比吭,很適合數(shù)據(jù)的動(dòng)態(tài)插入和刪除茬斧,但隨機(jī)訪問速度比較慢。另外梗逮,它還提供了專門用于操作表頭和表尾元素项秉,可當(dāng)做堆棧,隊(duì)列慷彤、雙向隊(duì)列使用娄蔼。


關(guān)于ArrayList和Vector區(qū)別如下:

? ? ? ?1 . ArrayList在內(nèi)存不夠時(shí)默認(rèn)是擴(kuò)展50% + 1個(gè),Vector是默認(rèn)擴(kuò)展1倍底哗。

? ? ? ?2 . Vector提供indexOf(obj, start)接口岁诉,ArrayList沒有。

? ? ? ?3 . Vector屬于線程安全級(jí)別的跋选,但是大多數(shù)情況下不使用Vector涕癣,因?yàn)榫€程安全需要更大的系統(tǒng)開銷。

ArrayList和LinkedList的區(qū)別如下:?

? ? ? ?1.對(duì)ArrayList和LinkedList而言前标,在列表末尾增加一個(gè)元素所花的開銷都是固定的坠韩。對(duì) ArrayList而言距潘,主要是在內(nèi)部數(shù)組中增加一項(xiàng),指向所添加的元素只搁,偶爾可能會(huì)導(dǎo)致對(duì)數(shù)組重新進(jìn)行分配音比;而對(duì)LinkedList而言,這個(gè)開銷是 統(tǒng)一的氢惋,分配一個(gè)內(nèi)部Entry對(duì)象洞翩。?

? ? ? ?2.在ArrayList的 中間插入或刪除一個(gè)元素意味著這個(gè)列表中剩余的元素都會(huì)被移動(dòng);而在LinkedList的中間插入或刪除一個(gè)元素的開銷是固定的焰望。?

? ? ? ?3.LinkedList不支持高效的隨機(jī)元素訪問骚亿。

? ? ? ?4.ArrayList的空 間浪費(fèi)主要體現(xiàn)在在list列表的結(jié)尾預(yù)留一定的容量空間,而LinkedList的空間花費(fèi)則體現(xiàn)在每一個(gè)元素都需要消耗相當(dāng)?shù)目臻g?

? ? ? ?可以這樣說(shuō):當(dāng)操作是在一列 數(shù)據(jù)的后面添加數(shù)據(jù)而不是在前面或中間,并且需要隨機(jī)地訪問其中的元素時(shí),使用ArrayList會(huì)提供比較好的性能熊赖;當(dāng)你的操作是在一列數(shù)據(jù)的前面或中 間添加或刪除數(shù)據(jù),并且按照順序訪問其中的元素時(shí),就應(yīng)該使用LinkedList了来屠。?

? ? ? ?所以,如果只是查找特定位置的元素或只在集合的末端增加秫舌、移除元素的妖,那么使用Vector或ArrayList都可以。如果是對(duì)其它指定位置的插入足陨、刪除操作嫂粟,最好選擇LinkedList。

參考:Vector,ArrayList,LinkedList的區(qū)別與適用場(chǎng)景


三墨缘、CopyOnWriteArrayList的了解星虹。

CopyOnWrite容器即寫時(shí)復(fù)制容器,用于并發(fā)讀寫镊讼。對(duì)CopyOnWriteArrayList進(jìn)行寫操作的時(shí)候宽涌,會(huì)復(fù)制出一份數(shù)組出來(lái),寫入新數(shù)據(jù)蝶棋,寫入完成后再把指針指向修改后的數(shù)組卸亮。寫入前和寫入中對(duì)CopyOnWriteArrayList讀操作讀到的都是未修改的數(shù)組。因?yàn)檫M(jìn)行了并發(fā)處理玩裙,寫操作耗時(shí)較長(zhǎng)兼贸,比較適合讀多寫少的應(yīng)用場(chǎng)景。

一些特點(diǎn):

1. 讀寫分離吃溅。2.數(shù)據(jù)最終一致性溶诞。3.使用另外開辟空間的思路,解決并發(fā)沖突决侈。

存在的問題:

1. 因?yàn)槊看螌懚紩?huì)復(fù)制一份出來(lái)螺垢,占用內(nèi)存,可能會(huì)造成頻繁gc。

2. 不能保證數(shù)據(jù)的實(shí)時(shí)一致性枉圃。

參考:

聊并發(fā)-Java中的Copy-On-Write容器

線程安全的CopyOnWriteArrayList介紹


四功茴、HashMap和HashTable的區(qū)別。

1. HashTable是java1.1中加入的讯蒲,HashMap是java1.2中加入的痊土。

2. HashMap支持鍵和值為null肄扎,HashMap將null的hashCode值定為了0墨林。

3. java7和之前,他們的哈希桶的內(nèi)部實(shí)現(xiàn)是一致的犯祠,在java8中旭等,默認(rèn)鏈表長(zhǎng)度大于8時(shí)HashMap內(nèi)部實(shí)現(xiàn)轉(zhuǎn)換為紅黑樹。

4. 初始容量大小和每次擴(kuò)充容量大小的不同衡载。HashTable默認(rèn)的初始大小為11搔耕,之后每次擴(kuò)充為原來(lái)的2n+1。HashMap默認(rèn)的初始化大小為16痰娱,之后每次擴(kuò)充為原來(lái)的2倍弃榨。

5.HashTable線程安全,HashMap線程不安全梨睁。因?yàn)镠ashTable在公開方法都加了Synchronized描述符鲸睛。

參考:HashMap 和 HashTable 到底哪不同 ?


五坡贺、HashMap和ConcurrentHashMap的區(qū)別官辈,HashMap的底層源碼。

HashMap:內(nèi)部實(shí)現(xiàn)是數(shù)組和鏈表遍坟,通過(guò)計(jì)算key的hash值來(lái)確定entry在數(shù)組中的位置拳亿,如果對(duì)應(yīng)位置已存在entry,則這插入到現(xiàn)存entry的前面愿伴,形成鏈表肺魁。

ConcurrentHashMap:在HashMap的基礎(chǔ)上,將數(shù)據(jù)分成了多個(gè)段隔节,默認(rèn)16個(gè)(concurrency level)鹅经,每次操作鎖住一個(gè)segment,避免多線程鎖的幾率官帘, 提高并發(fā)操作效率瞬雹。

參考及更多:HashMap源碼分析

Java8系列之重新認(rèn)識(shí)HashMap

ConcurrentHashMap的鎖分段技術(shù)


六、TreeMap刽虹、HashMap酗捌、LindedHashMap的區(qū)別。

TreeMap:遍歷順序?yàn)楦鶕?jù)鍵的大小排序后的順序,需要key類實(shí)現(xiàn)Comparable或構(gòu)造方法中傳入Comparator比較器胖缤。

LinkedHashMap:保證了遍歷順序?yàn)榇娣彭樞蛏辛部梢栽跇?gòu)造參數(shù)中指定跟據(jù)對(duì)key進(jìn)行操作的時(shí)間排序,時(shí)間最近的在最后哪廓。

HashMap :?鍵值對(duì)狗唉。保證鍵唯一性,值可以重復(fù)涡真。遍歷順序無(wú)序分俯。

參考:https://blog.csdn.net/fg2006/article/details/6411200


七、Collection包結(jié)構(gòu)哆料,與Collections的區(qū)別缸剪。

Collection是Collection層次結(jié)構(gòu)中的根接口,繼承了Iterable东亦。常用子類有List杏节、Set,List的子類又有ArrayList典阵、LinkedList奋渔、Vector。Set的子類有HashSet壮啊、LinkedHashSet嫉鲸、TreeSet。

Map是一個(gè)單獨(dú)的接口他巨,直接子類AbstratMap充坑,間接子類有HashMap、LinkedHashMap染突、TreeMap捻爷、ConcurrentHashMap等。

Collections是一個(gè)輔助Collection框架的工具類份企,由在 collection 上進(jìn)行操作或返回 collection 的靜態(tài)方法組成也榄。

參考:介紹Collection框架的結(jié)構(gòu);Collection 和 Collections的區(qū)別

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末司志,一起剝皮案震驚了整個(gè)濱河市甜紫,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌骂远,老刑警劉巖囚霸,帶你破解...
    沈念sama閱讀 222,729評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異激才,居然都是意外死亡拓型,警方通過(guò)查閱死者的電腦和手機(jī)额嘿,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,226評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)劣挫,“玉大人册养,你說(shuō)我怎么就攤上這事⊙构蹋” “怎么了球拦?”我有些...
    開封第一講書人閱讀 169,461評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)帐我。 經(jīng)常有香客問我坎炼,道長(zhǎng),這世上最難降的妖魔是什么焚刚? 我笑而不...
    開封第一講書人閱讀 60,135評(píng)論 1 300
  • 正文 為了忘掉前任点弯,我火速辦了婚禮扇调,結(jié)果婚禮上矿咕,老公的妹妹穿的比我還像新娘。我一直安慰自己狼钮,他們只是感情好碳柱,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,130評(píng)論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著熬芜,像睡著了一般莲镣。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上涎拉,一...
    開封第一講書人閱讀 52,736評(píng)論 1 312
  • 那天瑞侮,我揣著相機(jī)與錄音,去河邊找鬼鼓拧。 笑死半火,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的季俩。 我是一名探鬼主播钮糖,決...
    沈念sama閱讀 41,179評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼酌住!你這毒婦竟也來(lái)了店归?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 40,124評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤酪我,失蹤者是張志新(化名)和其女友劉穎消痛,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體都哭,經(jīng)...
    沈念sama閱讀 46,657評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡秩伞,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,723評(píng)論 3 342
  • 正文 我和宋清朗相戀三年谴古,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片稠歉。...
    茶點(diǎn)故事閱讀 40,872評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡掰担,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出怒炸,到底是詐尸還是另有隱情带饱,我是刑警寧澤,帶...
    沈念sama閱讀 36,533評(píng)論 5 351
  • 正文 年R本政府宣布阅羹,位于F島的核電站勺疼,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏捏鱼。R本人自食惡果不足惜执庐,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,213評(píng)論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望导梆。 院中可真熱鬧轨淌,春花似錦、人聲如沸看尼。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,700評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)藏斩。三九已至躏结,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間狰域,已是汗流浹背媳拴。 一陣腳步聲響...
    開封第一講書人閱讀 33,819評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留兆览,地道東北人屈溉。 一個(gè)月前我還...
    沈念sama閱讀 49,304評(píng)論 3 379
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像拓颓,于是被迫代替她去往敵國(guó)和親语婴。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,876評(píng)論 2 361

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

  • Collection & Map Collection 子類有 List 和 Set List --> Array...
    任教主來(lái)也閱讀 3,169評(píng)論 1 9
  • Collection ├List │├LinkedList │├ArrayList │└Vector │└Stac...
    AndyZX閱讀 880評(píng)論 0 1
  • 以下是《瘋狂Java講義》中的一些知識(shí)驶睦,如有錯(cuò)誤砰左,煩請(qǐng)指正。 集合概述 Java集合可以分為Set场航、List缠导、Ma...
    hainingwyx閱讀 540評(píng)論 0 1
  • Java集合是java提供的工具包,包含了常用的數(shù)據(jù)結(jié)構(gòu):集合溉痢、鏈表僻造、隊(duì)列憋他、棧、數(shù)組髓削、映射等竹挡。Java集合工具包位...
    聶叼叼閱讀 495評(píng)論 0 2
  • 十月的陽(yáng)光高照 在我醒不了的床上 你只是為我蓋一蓋被子就走了 可那只是一場(chǎng)夢(mèng) 我以為有永不褪去的幸福留在我身旁 卻...
    喵大大陳拾壹閱讀 562評(píng)論 0 0