Java中的集合框架面試題總結(jié)

Java中的集合框架面試題總結(jié)

深圳達(dá)內(nèi)教育      2022-05-02 16:00:01     77

Java中的集合框架面試題總結(jié),  一.List,Set,Map三者的區(qū)別及總結(jié)  List:對付順序的好幫手  List接口存儲一組不唯一(可以有多個(gè)元素引用相同的對象)

課程價(jià)格 請咨詢

上課時(shí)段: 授課校區(qū):

詳細(xì)介紹



  一.List,Set,Map三者的區(qū)別及總結(jié)


  List:對付順序的好幫手


  List接口存儲一組不唯一(可以有多個(gè)元素引用相同的對象),有序的對象


  Set:注重獨(dú)一無二的性質(zhì)


  不允許重復(fù)的集合。不會有多個(gè)元素引用相同的對象。


  Map:用Key來搜索的專家


  使用鍵值對存儲。Map會維護(hù)與Key有關(guān)聯(lián)的值。兩個(gè)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)這門課后我們就知道采用鏈表存儲,插入,刪除元素時(shí)間復(fù)雜度不受元素位置的影響,都是近似O(1)而數(shù)組為近似O(n),因此當(dāng)數(shù)據(jù)特別多,而且經(jīng)常需要插入刪除元素時(shí)建議選用linkedList.一般程序只用Arraylist就夠用了,因?yàn)橐话銛?shù)據(jù)量都不會蠻大,Arraylist是使用最多的集合類。


  三.ArrayList與Vector區(qū)別


  Vector類的所有方法都是同步的。可以由兩個(gè)線程安全地訪問一個(gè)Vector對象、但是一個(gè)線程訪問Vector,代碼要在同步操作上耗費(fèi)大量的時(shí)間。Arraylist不是同步的,所以在不需要同步時(shí)建議使用Arraylist。

  

  四.HashMap和Hashtable的區(qū)別


  HashMap是非線程安全的,HashTable是線程安全的;HashTable內(nèi)部的方法基本都經(jīng)過synchronized修飾。


  因?yàn)榫€程安全的問題,HashMap要比HashTable效率高一點(diǎn),HashTable基本被淘汰。


  HashMap允許有null值的存在,而在HashTable中put進(jìn)的鍵值只要有一個(gè)null,直接拋出NullPointerException。


  Hashtable和HashMap有幾個(gè)主要的不同:線程安全以及速度。僅在你需要完全的線程安全的時(shí)候使用Hashtable,而如果你使用Java5或以上的話,請使用ConcurrentHashMap吧


  五.HashSet和HashMap區(qū)別

  六.HashMap和ConcurrentHashMap的區(qū)別


  ConcurrentHashMap對整個(gè)桶數(shù)組進(jìn)行了分割分段(Segment),然后在每一個(gè)分段上都用lock鎖進(jìn)行保護(hù),相對于HashTable的synchronized鎖的粒度更精細(xì)了一些,并發(fā)性能更好,而HashMap沒有鎖機(jī)制,不是線程安全的。(JDK1.8之后ConcurrentHashMap啟用了一種全新的方式實(shí)現(xiàn),利用CAS算法。)


  HashMap的鍵值對允許有null,但是ConCurrentHashMap都不允許。


  七.HashSet如何檢查重復(fù)


  當(dāng)你把對象加入HashSet時(shí),HashSet會先計(jì)算對象的hashcode值來判斷對象加入的位置,同時(shí)也會與其他加入的對象的hashcode值作比較,如果沒有相符的hashcode,HashSet會假設(shè)對象沒有重復(fù)出現(xiàn)。但是如果發(fā)現(xiàn)有相同hashcode值的對象,這時(shí)會調(diào)用equals()方法來檢查hashcode相等的對象是否真的相同。如果兩者相同,HashSet就不會讓加入操作成功。


  hashCode()與equals()的相關(guān)規(guī)定:


  如果兩個(gè)對象相等,則hashcode一定也是相同的


  兩個(gè)對象相等,對兩個(gè)equals方法返回true


  兩個(gè)對象有相同的hashcode值,它們也不一定是相等的


  綜上,equals方法被覆蓋過,則hashCode方法也必須被覆蓋


  hashCode()的默認(rèn)行為是對堆上的對象產(chǎn)生獨(dú)特值。如果沒有重寫hashCode(),則該class的兩個(gè)對象無論如何都不會相等(即使這兩個(gè)對象指向相同的數(shù)據(jù))。


  ==與equals的區(qū)別


  ==是判斷兩個(gè)變量或?qū)嵗遣皇侵赶蛲粋€(gè)內(nèi)存空間equals是判斷兩個(gè)變量或?qū)嵗赶虻膬?nèi)存空間的值是不是相同


  ==是指對內(nèi)存地址進(jìn)行比較equals()是對字符串的內(nèi)容進(jìn)行比較3.==指引用是否相同equals()指的是值是否相同


  八.comparable和comparator的區(qū)別


  comparable接口實(shí)際上是出自java.lang包它有一個(gè)compareTo(Objectobj)方法用來排序


  comparator接口實(shí)際上是出自java.util包它有一個(gè)compare(Objectobj1,Objectobj2)方法用來排序


  一般我們需要對一個(gè)集合使用自定義排序時(shí),我們就要重寫compareTo方法或compare方法,當(dāng)我們需要對某一個(gè)集合實(shí)現(xiàn)兩種排序方式,比如一個(gè)song對象中的歌名和歌手名分別采用一種排序方法的話,我們可以重寫compareTo方法和使用自制的Comparator方法或者以兩個(gè)Comparator來實(shí)現(xiàn)歌名排序和歌星名排序,第二種代表我們只能使用兩個(gè)參數(shù)版的Collections.sort().


  1.Comparator定制排序


  2.重寫compareTo方法實(shí)現(xiàn)按年齡來排序


  九.如何對Object的list排序


  對objects數(shù)組進(jìn)行排序,我們可以用Arrays.sort()方法


  對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ù)組(查詢快,增刪慢線程不安全,效率高)


  Vector:數(shù)組(查詢快,增刪慢線程安全,效率低)


  linkedList:鏈表(查詢慢,增刪快線程不安全,效率高)


 ?、?Set


  HashSet(無序,唯一):哈希表或者叫散列集(hashtable)


  linkedHashSet:鏈表和哈希表組成。由鏈表保證元素的排序,由哈希表證元素的唯一性


  TreeSet(有序,唯一):紅黑樹(自平衡的排序二叉樹。)


  2.Map


  HashMap:基于哈希表的Map接口實(shí)現(xiàn)(哈希表對鍵進(jìn)行散列,Map結(jié)構(gòu)即映射表存放鍵值對)


  linkedHashMap:HashMap的基礎(chǔ)上加上了鏈表數(shù)據(jù)結(jié)構(gòu)


  HashTable:哈希表


  TreeMap:紅黑樹(自平衡的排序二叉樹)


  十三.集合的選用


  主要根據(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)來選用。


      以上就是深圳達(dá)內(nèi)教育Java培訓(xùn)機(jī)構(gòu)小編介紹的“Java中的集合框架面試題總結(jié)”的內(nèi)容,希望對大家有幫助,如有疑問,請?jiān)诰€咨詢,有專業(yè)老師隨時(shí)為你服務(wù)。


相關(guān)推薦


最新最全java面試題及答案(初級到高級)


史上最全的中高級JAVA工程師面試題及答案匯總


Java高級開發(fā)工程師面試題


2019史上最全java面試題題庫大全800題


哪有資深java工程師面試題


培訓(xùn)啦提醒您:交易時(shí)請核實(shí)對方資質(zhì),對于過大宣傳或承諾需謹(jǐn)慎!任何要求預(yù)付定金、匯款等方式均存在風(fēng)險(xiǎn),謹(jǐn)防上當(dāng)。