一艰额、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最常用)
二蔬咬、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容器
四功茴、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源碼分析
六、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ū)別