更新時間:2019-11-25 11:08:16 來源:動力節(jié)點 瀏覽2765次

一.List,Set,Map三者的區(qū)別及總結(jié)
List:對付順序的好幫手
List接口存儲一組不唯一(可以有多個元素引用相同的對象),有序的對象
Set:注重獨一無二的性質(zhì)
不允許重復(fù)的集合。不會有多個元素引用相同的對象。
Map:用Key來搜索的專家
使用鍵值對存儲。Map會維護與Key有關(guān)聯(lián)的值。兩個Key可以引用相同的對象,但Key不能重復(fù),典型的Key是String類型,但也可以是任何對象。
二.Arraylist與LinkedList區(qū)別
Arraylist底層使用的是數(shù)組(存讀數(shù)據(jù)效率高,插入刪除特定位置效率低),LinkedList底層使用的是雙向循環(huán)鏈表數(shù)據(jù)結(jié)構(gòu)(插入,刪除效率特別高)。學(xué)過數(shù)據(jù)結(jié)構(gòu)這門課后我們就知道采用鏈表存儲,插入,刪除元素時間復(fù)雜度不受元素位置的影響,都是近似O(1)而數(shù)組為近似O(n),因此當(dāng)數(shù)據(jù)特別多,而且經(jīng)常需要插入刪除元素時建議選用LinkedList.一般程序只用Arraylist就夠用了,因為一般數(shù)據(jù)量都不會蠻大,Arraylist是使用最多的集合類。
三.ArrayList與Vector區(qū)別
Vector類的所有方法都是同步的??梢杂蓛蓚€線程安全地訪問一個Vector對象、但是一個線程訪問Vector,代碼要在同步操作上耗費大量的時間。Arraylist不是同步的,所以在不需要同步時建議使用Arraylist。
四.HashMap和Hashtable的區(qū)別
HashMap是非線程安全的,HashTable是線程安全的;HashTable內(nèi)部的方法基本都經(jīng)過synchronized修飾。
因為線程安全的問題,HashMap要比HashTable效率高一點,HashTable基本被淘汰。
HashMap允許有null值的存在,而在HashTable中put進的鍵值只要有一個null,直接拋出NullPointerException。
Hashtable和HashMap有幾個主要的不同:線程安全以及速度。僅在你需要完全的線程安全的時候使用Hashtable,而如果你使用Java5或以上的話,請使用ConcurrentHashMap吧
五.HashSet和HashMap區(qū)別

六.HashMap和ConcurrentHashMap的區(qū)別
ConcurrentHashMap對整個桶數(shù)組進行了分割分段(Segment),然后在每一個分段上都用lock鎖進行保護,相對于HashTable的synchronized鎖的粒度更精細(xì)了一些,并發(fā)性能更好,而HashMap沒有鎖機制,不是線程安全的。(JDK1.8之后ConcurrentHashMap啟用了一種全新的方式實現(xiàn),利用CAS算法。)
HashMap的鍵值對允許有null,但是ConCurrentHashMap都不允許。
七.HashSet如何檢查重復(fù)
當(dāng)你把對象加入HashSet時,HashSet會先計算對象的hashcode值來判斷對象加入的位置,同時也會與其他加入的對象的hashcode值作比較,如果沒有相符的hashcode,HashSet會假設(shè)對象沒有重復(fù)出現(xiàn)。但是如果發(fā)現(xiàn)有相同hashcode值的對象,這時會調(diào)用equals()方法來檢查hashcode相等的對象是否真的相同。如果兩者相同,HashSet就不會讓加入操作成功。
hashCode()與equals()的相關(guān)規(guī)定:
如果兩個對象相等,則hashcode一定也是相同的
兩個對象相等,對兩個equals方法返回true
兩個對象有相同的hashcode值,它們也不一定是相等的
綜上,equals方法被覆蓋過,則hashCode方法也必須被覆蓋
hashCode()的默認(rèn)行為是對堆上的對象產(chǎn)生獨特值。如果沒有重寫hashCode(),則該class的兩個對象無論如何都不會相等(即使這兩個對象指向相同的數(shù)據(jù))。
==與equals的區(qū)別
==是判斷兩個變量或?qū)嵗遣皇侵赶蛲粋€內(nèi)存空間equals是判斷兩個變量或?qū)嵗赶虻膬?nèi)存空間的值是不是相同
==是指對內(nèi)存地址進行比較equals()是對字符串的內(nèi)容進行比較3.==指引用是否相同equals()指的是值是否相同
八.comparable和comparator的區(qū)別
comparable接口實際上是出自java.lang包它有一個compareTo(Objectobj)方法用來排序
comparator接口實際上是出自java.util包它有一個compare(Objectobj1,Objectobj2)方法用來排序
一般我們需要對一個集合使用自定義排序時,我們就要重寫compareTo方法或compare方法,當(dāng)我們需要對某一個集合實現(xiàn)兩種排序方式,比如一個song對象中的歌名和歌手名分別采用一種排序方法的話,我們可以重寫compareTo方法和使用自制的Comparator方法或者以兩個Comparator來實現(xiàn)歌名排序和歌星名排序,第二種代表我們只能使用兩個參數(shù)版的Collections.sort().
1.Comparator定制排序
2.重寫compareTo方法實現(xiàn)按年齡來排序
九.如何對Object的list排序
對objects數(shù)組進行排序,我們可以用Arrays.sort()方法
對objects的集合進行排序,需要使用Collections.sort()方法
十.如何實現(xiàn)數(shù)組與List的相互轉(zhuǎn)換
List轉(zhuǎn)數(shù)組:toArray(arraylist.size()方法;數(shù)組轉(zhuǎn)List:Arrays的asList(a)方法
十一.如何求ArrayList集合的交集并集差集去重復(fù)并集
需要用到List接口中定義的幾個方法:
addAll(Collection<?extendsE>c):按指定集合的Iterator返回的順序?qū)⒅付现械乃性刈芳拥酱肆斜淼哪┪矊嵗a:
retainAll(Collection<?>c):僅保留此列表中包含在指定集合中的元素。
removeAll(Collection<?>c):從此列表中刪除指定集合中包含的所有元素。
十二.集合框架底層數(shù)據(jù)結(jié)構(gòu)總結(jié)
1.Collection
?、?List
Arraylist:數(shù)組(查詢快,增刪慢線程不安全,效率高)
Vector:數(shù)組(查詢快,增刪慢線程安全,效率低)
LinkedList:鏈表(查詢慢,增刪快線程不安全,效率高)
?、?Set
HashSet(無序,唯一):哈希表或者叫散列集(hashtable)
LinkedHashSet:鏈表和哈希表組成。由鏈表保證元素的排序,由哈希表證元素的唯一性
TreeSet(有序,唯一):紅黑樹(自平衡的排序二叉樹。)
2.Map
HashMap:基于哈希表的Map接口實現(xiàn)(哈希表對鍵進行散列,Map結(jié)構(gòu)即映射表存放鍵值對)
LinkedHashMap:HashMap的基礎(chǔ)上加上了鏈表數(shù)據(jù)結(jié)構(gòu)
HashTable:哈希表
TreeMap:紅黑樹(自平衡的排序二叉樹)
十三.集合的選用
主要根據(jù)集合的特點來選用,比如我們需要根據(jù)鍵值獲取到元素值時就選用Map接口下的集合,需要排序時選擇TreeMap,不需要排序時就選擇HashMap,需要保證線程安全就選用ConcurrentHashMap.當(dāng)我們只需要存放元素值時,就選擇實現(xiàn)Collection接口的集合,需要保證元素唯一時選擇實現(xiàn)Set接口的集合比如TreeSet或HashSet,不需要就選擇實現(xiàn)List接口的比如ArrayList或LinkedList,然后再根據(jù)實現(xiàn)這些接口的集合的特點來選用。
以上就是動力節(jié)點Java培訓(xùn)機構(gòu)小編介紹的“Java中的集合框架面試題總結(jié)”的內(nèi)容,希望對大家有幫助,如有疑問,請在線咨詢,有專業(yè)老師隨時為你服務(wù)。
相關(guān)推薦
最新最全java面試題及答案(初級到高級)
相關(guān)閱讀