Java集合相關面試題總結

一、簡介

Java集合類是我們日常編程中使用較多的一個,常見的有:ArrayList、LinkedList、HashMap、HashSet、ConcurrentHashMap、LinkedBlockQueue等等,集合類同時也是面試時必問的一項技能,所以我們有必要了解一些常見的面試題,本文將總結一部分比較常遇到的集合相關的面試題,希望可以幫助到大家。

二、集合相關面試題

【a】集合類繼承圖

上述類圖中,實線邊框的是實現類,比如ArrayList,LinkedList,HashMap等,折線邊框的是抽象類,比如AbstractCollection,AbstractList,AbstractMap等,而點線邊框的是接口,比如Collection,Iterator,List等。

簡單說明:

  • Collection接口是所有集合類的根接口,主要的實現類有List、Set和Queue,注意Map並不是Collection的子接口,Map是Java.util包中的另一個接口,它和Collection接口沒有關係,是相互獨立的,但是都屬於集合類的一部分。
  • Iterator:所有集合類都實現了Iterator接口,主要用於遍歷集合中的元素,主要方法:
  • hasNext():判斷集合中是否還有下一個元素;next():返回當前元素的下一個元素      remove():刪除當前元素

【b】請簡單介紹一下List、Map和Set?

集合類 是否有序 是否可重複
List 元素有序 元素可以重複
Map 鍵值對方式存儲元素 Map中的鍵唯一,不可重複,但值可以重複
Set 元素無序 元素不可重複

文字描述:

1、List:List集合存放的對象是有序的,同時也是可以重複的。List查詢效率相對快一些,往List集合插入或者刪除元素,由於會涉及到移動元素的成本,速度相對慢一些。

2、Set:Set集合存放的對象是無序,不能重複的。

3、Map:Map集合中的元素都是以鍵值對的方式進行存儲的,鍵是唯一的,不可以重複,但是值可以重複。

【c】請簡單說明一下ArrayList和LinkedList的區別?

區別 ArrayList LinkedList
底層數據結構 ArrayList底層是基於數組實現的,涉及到很多的數組拷貝,移動等操作。 LinkedList底層是基於鏈表實現的,通過修改鏈表的指向來達到元素的插入、刪除等。
插入/刪除效率 ArrayList由於插入、刪除時需要移動元素,所以速度較慢 LinkedList直接通過修改鏈表的指向,斷開鏈表等操作實現插入、刪除,所以速度很快。
查詢效率 ArrayList直接通過數組的下標就可以找到對應的元素,所以查詢速度很快 LinkedList由於需要遍歷鏈表,挨個進行比較,所以速度較慢
適用場景 查詢多,插入、刪除、更新比較少的場景 查詢少,插入、刪除、更新比較多的場景

【d】請簡單說明一下HashMap、Hashtable、ConcurrentHashMap、LinkedHashMap、TreeMap類?

區別 HashMap Hashtable ConcurrentHashMap LinkedHashMap TreeMap
說明

HashMap是根據鍵的HashCode值計算出元素在bucket[]桶數組中的索引下標,訪問效率很高。遍歷時,取得數據的順序是完全隨機的。

因爲HashMap鍵是不可以重複的,所以HashMap最多隻允許一條記錄的鍵爲Null,允許多條記錄的值爲Null,是非同步的,線程不安全。

Hashtable與HashMap類似,是HashMap的線程安全版,它支持線程的同步,即任一時刻只有一個線程能寫Hashtable,因此也導致了Hashtale在寫入時會比較慢,它繼承自Dictionary類,不同的是它不允許記錄的鍵或者值爲null,同時效率較低。 線程安全,並且鎖分離。JDK1.7中ConcurrentHashMap內部使用分段鎖機制(Segment)來表示這些不同的部分,每個段其實就是一個小的hash table,它們有自己的鎖。只要多個修改操作發生在不同的段上,它們就可以併發進行。在JDK1.8中廢棄了分段鎖,採用Sychronized+CAS方式實現安全控制。 LinkedHashMap保存了記錄的插入順序,在用Iteraor遍歷LinkedHashMap時,先得到的記錄肯定是先插入的,在遍歷的時候會比HashMap慢。 TreeMap實現SortMap接口,能夠把它保存的記錄根據鍵排序,默認是按鍵值的升序排序(自然順序),也可以指定排序的比較器,當用Iterator遍歷TreeMap時,得到的記錄是排過序的。不允許key值爲空,非同步的;

【e】請談一下Vector和ArrayList的區別?

區別 Vector ArrayList
底層數據結構 基於數組實現 基於數組實現
是否線程安全 由於加入了同步機制,所以線程安全 線程不安全
效率 由於加入了Synchronized同步機制,所以效率相對慢一些 效率相對快一些

【f】集合框架中的泛型有什麼優點?

  Java1.5引入了泛型,所有的集合接口和實現都大量地使用泛型。泛型允許我們爲集合指定一個可以容納的對象類型,因此,如果你添加其它類型的任何元素,它會在編譯時報錯。這避免了在運行時出現ClassCastException,因爲你將會在編譯時得到報錯信息。泛型也使得我們不需要使用顯式轉換和instanceOf操作符。它也給運行時帶來好處,因爲不會產生類型檢查的字節碼指令。

【g】簡單說明一下集合中的快速失敗機制(fail-fast)?

每次我們嘗試獲取下一個元素的時候,Iterator fail-fast機制都會去檢查當前集合結構裏的任何改動。如果發現任何改動,它拋出ConcurrentModificationException併發修改異常。Collection中所有Iterator的實現都是按fail-fast來設計的。

【h】HashMap的工作原理?

可以參考另外一篇博文,裏面詳細介紹了其工作原理:【https://blog.csdn.net/Weixiaohuai/article/details/103882258

【i】請談談hashCode()和equals()方法的重要性?

HashMap利用key對象的hashCode()和equals()方法去計算元素在數組中的索引下標。當我們從HashMap中獲取值時,如果這些方法沒有被正確地實現,在這種情況下,兩個不同Key也許會產生相同的hashCode()和equals()輸出,HashMap將會認爲它們是相同的,然後覆蓋它們,而非把它們存儲到不同的地方。同樣的,所有不允許存儲重複數據的集合類都使用hashCode()和equals()去查找重複,所以正確實現它們非常重要。equals()和hashCode()的實現應該遵循以下規則:

  • (1)如果o1.equals(o2),那麼o1.hashCode() == o2.hashCode()總是爲true的;
  • (2)如果o1.hashCode() == o2.hashCode(),並不意味着o1.equals(o2)會爲true;

【j】請簡單說明一下Array和ArrayList有何區別?

區別 Array ArrayList
容納對象類型  Array可以容納基本類型和對象 ArrayList只能容納對象
大小 Array是指定大小的 ArrayList大小是可以擴容的
適用場景 大小固定的集合時可以考慮使用數組Array 當大小動態變化時考慮使用ArrayList

【k】Collections類是什麼?

Java.util.Collections是一個工具類僅包含靜態方法,它們操作或返回集合。它包含操作集合的多態算法,返回一個由指定集合支持的新集合和其它一些內容。這個類包含集合框架算法的方法,比如折半搜索、排序、混編和逆序等。

【l】Comparable和Comparator接口是什麼?

如果我們想使用Array或Collection的排序方法時,需要在自定義類裏實現Java提供Comparable接口。Comparable接口有compareTo(T OBJ)方法,它被排序方法所使用。我們應該重寫這個方法,如果“this”對象比傳遞的對象參數更小、相等或更大時,它返回一個負整數、0或正整數。

但是,在大多數實際情況下,我們想根據不同參數進行排序,需要使用Comparator接口,因爲Comparable.compareTo(Object o)方法實現只能基於一個字段進行排序,我們不能根據對象排序的需要選擇字段。

Comparator接口的compare(Object o1, Object o2)方法的實現需要傳遞兩個對象參數,若第一個參數比第二個小,返回負整數;若第一個等於第二個,返回0;若第一個比第二個大,返回正整數。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章