1.List,Set,Map三者的區(qū)別及總結(jié)
List:對(duì)付順序的好幫手
List接口存儲(chǔ)一組不唯一(可以有多個(gè)元素引用相同的對(duì)象)黍衙,有序的對(duì)象
Set:注重獨(dú)一無二的性質(zhì)
不允許重復(fù)的集合亦渗。不會(huì)有多個(gè)元素引用相同的對(duì)象预明。
Map:用Key來搜索的專家
使用鍵值對(duì)存儲(chǔ)柠逞。Map會(huì)維護(hù)與Key有關(guān)聯(lián)的值套像。兩個(gè)Key可以引用相同的對(duì)象衣撬,但Key不能重復(fù)乖订,典型的Key是String類型,但也可以是任何對(duì)象具练。
2.Arraylist 與 LinkedList 區(qū)別
Arraylist底層使用的是數(shù)組(存讀數(shù)據(jù)效率高乍构,插入刪除特定位置效率低),
LinkedList底層使用的是雙向循環(huán)鏈表數(shù)據(jù)結(jié)構(gòu)(插入扛点,刪除效率特別高)哥遮。
學(xué)過數(shù)據(jù)結(jié)構(gòu)這門課后我們就知道采用鏈表存儲(chǔ),插入陵究,刪除元素時(shí)間復(fù)雜度不受元素位置的影響眠饮,都是近似O(1)而數(shù)組為近似O(n),因此當(dāng)數(shù)據(jù)特別多铜邮,而且經(jīng)常需要插入刪除元素時(shí)建議選用LinkedList.一般程序只用Arraylist就夠用了仪召,因?yàn)橐话銛?shù)據(jù)量都不會(huì)蠻大,Arraylist是使用最多的集合類松蒜。
2.ArrayList 與 Vector 區(qū)別(為什么要用Arraylist取代Vector呢扔茅?)
Vector類的所有方法都是同步的〗彰纾可以由兩個(gè)線程安全地訪問一個(gè)Vector對(duì)象召娜、但是一個(gè)線程訪問Vector,代碼要在同步操作上耗費(fèi)大量的時(shí)間惊楼。
Arraylist不是同步的玖瘸,所以在不需要同步時(shí)建議使用Arraylist秸讹。
3.HashMap 和 Hashtable 的區(qū)別
HashMap是非線程安全的,效率高一點(diǎn); 允許有null值的存在
HashTable是線程安全的,內(nèi)部的方法基本都經(jīng)過synchronized修飾; 只要有一個(gè)null雅倒,直接拋出NullPointerException璃诀。
Java5或以上的話,請(qǐng)使用ConcurrentHashMap吧
4.HashSet 和 HashMap 區(qū)別
5.HashMap 和 ConcurrentHashMap 的區(qū)別
1.ConcurrentHashMap對(duì)整個(gè)桶數(shù)組進(jìn)行了分割分段(Segment)屯断,然后在每一個(gè)分段上都用lock鎖進(jìn)行保護(hù),相對(duì)于HashTable的synchronized鎖的粒度更精細(xì)了一些侣诺,并發(fā)性能更好殖演,而HashMap沒有鎖機(jī)制,不是線程安全的年鸳。(JDK1.8之后ConcurrentHashMap啟用了一種全新的方式實(shí)現(xiàn),利用CAS算法趴久。)
2.HashMap的鍵值對(duì)允許有null,但是ConCurrentHashMap都不允許搔确。
6.HashSet如何檢查重復(fù)
當(dāng)你把對(duì)象加入HashSet時(shí)彼棍,HashSet會(huì)先計(jì)算對(duì)象的hashcode值來判斷對(duì)象加入的位置,同時(shí)也會(huì)與其他加入的對(duì)象的hashcode值作比較:
如果沒有相符的hashcode膳算,HashSet會(huì)假設(shè)對(duì)象沒有重復(fù)出現(xiàn)座硕。
如果發(fā)現(xiàn)有相同hashcode值的對(duì)象,這時(shí)會(huì)調(diào)用equals()方法來檢查hashcode相等的對(duì)象是否真的相同涕蜂。如果兩者相同华匾,HashSet就不會(huì)讓加入操作成功。
7.hashCode()與equals()的相關(guān)規(guī)定:
如果兩個(gè)對(duì)象相等机隙,則hashcode一定也是相同的
兩個(gè)對(duì)象相等,對(duì)兩個(gè)equals方法返回true
兩個(gè)對(duì)象有相同的hashcode值蜘拉,它們也不一定是相等的
綜上,equals方法被覆蓋過有鹿,則hashCode方法也必須被覆蓋
hashCode()的默認(rèn)行為是對(duì)堆上的對(duì)象產(chǎn)生獨(dú)特值旭旭。如果沒有重寫hashCode(),則該class的兩個(gè)對(duì)象無論如何都不會(huì)相等(即使這兩個(gè)對(duì)象指向相同的數(shù)據(jù))葱跋。
8.comparable 和 comparator的區(qū)別持寄?
comparable接口實(shí)際上是出自java.lang包 它有一個(gè) compareTo(Object obj)方法用來排序
comparator接口實(shí)際上是出自 java.util 包它有一個(gè)compare(Object obj1, Object obj2)方法用來排序
對(duì)一個(gè)集合使用自定義排序時(shí),我們就要重寫compareTo方法或compare方法娱俺,當(dāng)我們需要對(duì)某一個(gè)集合實(shí)現(xiàn)兩種排序方式:
比如一個(gè)song對(duì)象中的歌名和歌手名分別采用一種排序方法的話际看,我們可以重寫compareTo方法和使用自制的Comparator方法或者以兩個(gè)Comparator來實(shí)現(xiàn)歌名排序和歌星名排序,第二種代表我們只能使用兩個(gè)參數(shù)版的Collections.sort().
Comparator定制排序
重寫compareTo方法實(shí)現(xiàn)按年齡來排序
9.如何對(duì)Object的list排序矢否?
對(duì)objects數(shù)組進(jìn)行排序仲闽,我們可以用Arrays.sort()方法
對(duì)objects的集合進(jìn)行排序,需要使用Collections.sort()方法
10.如何實(shí)現(xiàn)數(shù)組與List的相互轉(zhuǎn)換僵朗?
List轉(zhuǎn)數(shù)組:toArray(arraylist.size()方法赖欣;
數(shù)組轉(zhuǎn)List:Arrays的asList(a)方法
11.如何求ArrayList集合的交集 并集 差集 去重復(fù)并集
需要用到List接口中定義的幾個(gè)方法:
addAll(Collection c) :按指定集合的Iterator返回的順序?qū)⒅付现械乃性刈芳拥酱肆斜淼哪┪?/p>
實(shí)例代碼:
retainAll(Collection c): 僅保留此列表中包含在指定集合中的元素屑彻。
removeAll(Collection c) :從此列表中刪除指定集合中包含的所有元素。
12.集合的選用
主要根據(jù)集合的特點(diǎn)來選用顶吮,比如我們需要根據(jù)鍵值獲取到元素值時(shí)就選用Map接口下的集合社牲,需要排序時(shí)選擇TreeMap,不需要排序時(shí)就選擇HashMap,需要保證線程安全就選用ConcurrentHashMap.當(dāng)我們只需要存放元素值時(shí),就選擇實(shí)現(xiàn)Collection接口的集合悴了,需要保證元素唯一時(shí)選擇實(shí)現(xiàn)Set接口的集合比如TreeSet或HashSet搏恤,不需要就選擇實(shí)現(xiàn)List接口的比如ArrayList或LinkedList,然后再根據(jù)實(shí)現(xiàn)這些接口的集合的特點(diǎn)來選用湃交。
13.集合框架底層數(shù)據(jù)結(jié)構(gòu)總結(jié)
- Collection
1. List
Arraylist:數(shù)組(查詢快,增刪慢? 線程不安全,效率高? )
Vector:數(shù)組(查詢快,增刪慢 線程安全,效率低? )
LinkedList:鏈表(查詢慢,增刪快? 線程不安全,效率高? )
2. Set
HashSet(無序熟空,唯一):哈希表或者叫散列集(hash table)
LinkedHashSet:鏈表和哈希表組成 。 由鏈表保證元素的排序 搞莺, 由哈希表證元素的唯一性
TreeSet(有序息罗,唯一):紅黑樹(自平衡的排序二叉樹。)
- Map
HashMap:基于哈希表的Map接口實(shí)現(xiàn)(哈希表對(duì)鍵進(jìn)行散列才沧,Map結(jié)構(gòu)即映射表存放鍵值對(duì))
LinkedHashMap:HashMap? 的基礎(chǔ)上加上了鏈表數(shù)據(jù)結(jié)構(gòu)
HashTable:哈希表
TreeMap:紅黑樹(自平衡的排序二叉樹)
14.HashMap 的工作原理及代碼實(shí)現(xiàn)
https://juejin.im/post/5ab0568b5188255580020e56
15.ConcurrentHashMap 的工作原理及代碼實(shí)現(xiàn)
http://www.cnblogs.com/chengxiao/p/6842045.html