一.List,Set,Map三者的區(qū)別及總結(jié)
List:對(duì)付順序的好幫手
List接口存儲(chǔ)一組不唯一(可以有多個(gè)元素引用相同的對(duì)象),有序的對(duì)象
Set:注重獨(dú)一無(wú)二的性質(zhì)
不允許重復(fù)的集合。不會(huì)有多個(gè)元素引用相同的對(duì)象。
Map:用Key來(lái)搜索的專(zhuān)家
使用鍵值對(duì)存儲(chǔ)。Map會(huì)維護(hù)與Key有關(guān)聯(lián)的值。兩個(gè)Key可以引用相同的對(duì)象,但Key不能重復(fù),典型的Key是String類(lèi)型,但也可以是任何對(duì)象。
二.Arraylist與linkedList區(qū)別
Arraylist底層使用的是數(shù)組(存讀數(shù)據(jù)效率高,插入刪除特定位置效率低),linkedList底層使用的是雙向循環(huán)鏈表數(shù)據(jù)結(jié)構(gòu)(插入,刪除效率特別高)。學(xué)過(guò)數(shù)據(jù)結(jié)構(gòu)這門(mén)課后我們就知道采用鏈表存儲(chǔ),插入,刪除元素時(shí)間復(fù)雜度不受元素位置的影響,都是近似O(1)而數(shù)組為近似O(n),因此當(dāng)數(shù)據(jù)特別多,而且經(jīng)常需要插入刪除元素時(shí)建議選用linkedList.一般程序只用Arraylist就夠用了,因?yàn)橐话銛?shù)據(jù)量都不會(huì)蠻大,Arraylist是使用最多的集合類(lèi)。
三.ArrayList與Vector區(qū)別
Vector類(lèi)的所有方法都是同步的??梢杂蓛蓚€(gè)線(xiàn)程安全地訪(fǎng)問(wèn)一個(gè)Vector對(duì)象、但是一個(gè)線(xiàn)程訪(fǎng)問(wèn)Vector,代碼要在同步操作上耗費(fèi)大量的時(shí)間。Arraylist不是同步的,所以在不需要同步時(shí)建議使用Arraylist。
四.HashMap和Hashtable的區(qū)別
HashMap是非線(xiàn)程安全的,HashTable是線(xiàn)程安全的;HashTable內(nèi)部的方法基本都經(jīng)過(guò)synchronized修飾。
因?yàn)榫€(xiàn)程安全的問(wèn)題,HashMap要比HashTable效率高一點(diǎn),HashTable基本被淘汰。
HashMap允許有null值的存在,而在HashTable中put進(jìn)的鍵值只要有一個(gè)null,直接拋出NullPointerException。
Hashtable和HashMap有幾個(gè)主要的不同:線(xiàn)程安全以及速度。僅在你需要完全的線(xiàn)程安全的時(shí)候使用Hashtable,而如果你使用Java5或以上的話(huà),請(qǐng)使用ConcurrentHashMap吧
五.HashSet和HashMap區(qū)別
六.HashMap和ConcurrentHashMap的區(qū)別
ConcurrentHashMap對(duì)整個(gè)桶數(shù)組進(jìn)行了分割分段(Segment),然后在每一個(gè)分段上都用lock鎖進(jìn)行保護(hù),相對(duì)于HashTable的synchronized鎖的粒度更精細(xì)了一些,并發(fā)性能更好,而HashMap沒(méi)有鎖機(jī)制,不是線(xiàn)程安全的。(JDK1.8之后ConcurrentHashMap啟用了一種全新的方式實(shí)現(xiàn),利用CAS算法。)
HashMap的鍵值對(duì)允許有null,但是ConCurrentHashMap都不允許。
七.HashSet如何檢查重復(fù)
當(dāng)你把對(duì)象加入HashSet時(shí),HashSet會(huì)先計(jì)算對(duì)象的hashcode值來(lái)判斷對(duì)象加入的位置,同時(shí)也會(huì)與其他加入的對(duì)象的hashcode值作比較,如果沒(méi)有相符的hashcode,HashSet會(huì)假設(shè)對(duì)象沒(méi)有重復(fù)出現(xiàn)。但是如果發(fā)現(xiàn)有相同hashcode值的對(duì)象,這時(shí)會(huì)調(diào)用equals()方法來(lái)檢查hashcode相等的對(duì)象是否真的相同。如果兩者相同,HashSet就不會(huì)讓加入操作成功。
hashCode()與equals()的相關(guān)規(guī)定:
如果兩個(gè)對(duì)象相等,則hashcode一定也是相同的
兩個(gè)對(duì)象相等,對(duì)兩個(gè)equals方法返回true
兩個(gè)對(duì)象有相同的hashcode值,它們也不一定是相等的
綜上,equals方法被覆蓋過(guò),則hashCode方法也必須被覆蓋
hashCode()的默認(rèn)行為是對(duì)堆上的對(duì)象產(chǎn)生獨(dú)特值。如果沒(méi)有重寫(xiě)hashCode(),則該class的兩個(gè)對(duì)象無(wú)論如何都不會(huì)相等(即使這兩個(gè)對(duì)象指向相同的數(shù)據(jù))。
==與equals的區(qū)別
==是判斷兩個(gè)變量或?qū)嵗遣皇侵赶蛲粋€(gè)內(nèi)存空間equals是判斷兩個(gè)變量或?qū)嵗赶虻膬?nèi)存空間的值是不是相同
==是指對(duì)內(nèi)存地址進(jìn)行比較equals()是對(duì)字符串的內(nèi)容進(jìn)行比較3.==指引用是否相同equals()指的是值是否相同
八.comparable和comparator的區(qū)別
comparable接口實(shí)際上是出自java.lang包它有一個(gè)compareTo(Objectobj)方法用來(lái)排序
comparator接口實(shí)際上是出自java.util包它有一個(gè)compare(Objectobj1,Objectobj2)方法用來(lái)排序
一般我們需要對(duì)一個(gè)集合使用自定義排序時(shí),我們就要重寫(xiě)compareTo方法或compare方法,當(dāng)我們需要對(duì)某一個(gè)集合實(shí)現(xiàn)兩種排序方式,比如一個(gè)song對(duì)象中的歌名和歌手名分別采用一種排序方法的話(huà),我們可以重寫(xiě)compareTo方法和使用自制的Comparator方法或者以?xún)蓚€(gè)Comparator來(lái)實(shí)現(xiàn)歌名排序和歌星名排序,第二種代表我們只能使用兩個(gè)參數(shù)版的Collections.sort().
1.Comparator定制排序
2.重寫(xiě)compareTo方法實(shí)現(xiàn)按年齡來(lái)排序
九.如何對(duì)Object的list排序
對(duì)objects數(shù)組進(jìn)行排序,我們可以用Arrays.sort()方法
對(duì)objects的集合進(jìn)行排序,需要使用Collections.sort()方法
十.如何實(shí)現(xiàn)數(shù)組與List的相互轉(zhuǎn)換
List轉(zhuǎn)數(shù)組:toArray(arraylist.size()方法;數(shù)組轉(zhuǎn)List:Arrays的asList(a)方法
十一.如何求ArrayList集合的交集并集差集去重復(fù)并集
需要用到List接口中定義的幾個(gè)方法:
addAll(Collection<?extendsE>c):按指定集合的Iterator返回的順序?qū)⒅付现械乃性刈芳拥酱肆斜淼哪┪矊?shí)例代碼:
retainAll(Collection<?>c):僅保留此列表中包含在指定集合中的元素。
removeAll(Collection<?>c):從此列表中刪除指定集合中包含的所有元素。
十二.集合框架底層數(shù)據(jù)結(jié)構(gòu)總結(jié)
1.Collection
①.List
Arraylist:數(shù)組(查詢(xún)快,增刪慢線(xiàn)程不安全,效率高)
Vector:數(shù)組(查詢(xún)快,增刪慢線(xiàn)程安全,效率低)
linkedList:鏈表(查詢(xún)慢,增刪快線(xiàn)程不安全,效率高)
?、?Set
HashSet(無(wú)序,唯一):哈希表或者叫散列集(hashtable)
linkedHashSet:鏈表和哈希表組成。由鏈表保證元素的排序,由哈希表證元素的唯一性
TreeSet(有序,唯一):紅黑樹(shù)(自平衡的排序二叉樹(shù)。)
2.Map
HashMap:基于哈希表的Map接口實(shí)現(xiàn)(哈希表對(duì)鍵進(jìn)行散列,Map結(jié)構(gòu)即映射表存放鍵值對(duì))
linkedHashMap:HashMap的基礎(chǔ)上加上了鏈表數(shù)據(jù)結(jié)構(gòu)
HashTable:哈希表
TreeMap:紅黑樹(shù)(自平衡的排序二叉樹(shù))
十三.集合的選用
主要根據(jù)集合的特點(diǎn)來(lái)選用,比如我們需要根據(jù)鍵值獲取到元素值時(shí)就選用Map接口下的集合,需要排序時(shí)選擇TreeMap,不需要排序時(shí)就選擇HashMap,需要保證線(xiàn)程安全就選用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)來(lái)選用。
以上就是深圳達(dá)內(nèi)教育Java培訓(xùn)機(jī)構(gòu)小編介紹的“Java中的集合框架面試題總結(jié)”的內(nèi)容,希望對(duì)大家有幫助,如有疑問(wèn),請(qǐng)?jiān)诰€(xiàn)咨詢(xún),有專(zhuān)業(yè)老師隨時(shí)為你服務(wù)。
相關(guān)推薦
最新最全java面試題及答案(初級(jí)到高級(jí))
史上最全的中高級(jí)JAVA工程師面試題及答案匯總
Java高級(jí)開(kāi)發(fā)工程師面試題
2019史上最全java面試題題庫(kù)大全800題
哪有資深java工程師面試題