Java集合精選常見面試題

前言博主只是這篇文章的搬運工,為了加強記憶自己梳理了一遍并擴展了部分內容 。
集合拓展鏈接:集合概述&集合之Collection接口 - 至安 - 博客園 (cnblogs.com)
Java 集合概覽Java 集合,也叫作容器,主要是由兩大接口派生而來:一個是 Collection接口,主要用于存放單一元素;另一個是 Map 接口,主要用于存放鍵值對 。對于Collection 接口,下面又有三個主要的子接口:List、SetQueue
Java 集合框架如下圖所示:

Java集合精選常見面試題

文章插圖
注:圖中只列舉了主要的繼承派生關系,并沒有列舉所有關系 。比方省略了AbstractList ,  NavigableSet等抽象類以及其他的一些輔助類,如想深入了解 , 可自行查看源碼
1. 為什么要使用集合?當我們需要保存一組類型相同的數據的時候 , 我們應該是用一個容器來保存 , 這個容器就是數組,但是,使用數組存儲對象具有一定的弊端,因為我們在實際開發中,存儲的數據的類型是多種多樣的,于是,就出現了“集合” , 集合同樣也是用來存儲多個數據的 。
數組的缺點是一旦聲明之后 , 長度就不可變了;同時,聲明數組時的數據類型也決定了該數組存儲的數據的類型;而且 , 數組存儲的數據是有序的、可重復的,特點單一 。但是集合提高了數據存儲的靈活性 , Java 集合不僅可以用來存儲不同類型不同數量的對象,還可以保存具有映射關系的數據
2. 說說 List, Set,Queue,Map 四者的區別?
  • List(對付順序的好幫手): 存儲的元素是有序的、可重復的 。
  • Set(注重獨一無二的性質): 存儲的元素是無序的、不可重復的 。
  • Queue(實現排隊功能的叫號機): 按特定的排隊規則來確定先后順序,存儲的元素是有序的、可重復的,操作頭尾數據效率高 。
  • Map(用 key 來搜索的專家): 使用鍵值對(key-value)存儲,類似于數學上的函數 y=f(x),"x" 代表 key,"y" 代表 value,key 是無序的、不可重復的,value 是無序的、可重復的,每個鍵最多映射到一個值 。
3. 集合框架底層數據結構總結先來看一下 Collection 接口下面的集合 。
List
  • ArraylistObject[] 數組
  • VectorObject[] 數組
  • LinkedList: 雙向鏈表(JDK1.6 之前為循環鏈表,JDK1.7 取消了循環)
Set
  • HashSet(無序,唯一): 基于 HashMap 實現的,底層采用 HashMap 來保存元素
  • LinkedHashSet: LinkedHashSetHashSet 的子類,并且其內部是通過 LinkedHashMap 來實現的 。有點類似于我們之前說的 LinkedHashMap 其內部是基于 HashMap 實現一樣,不過還是有一點點區別的
  • TreeSet(有序,唯一): 紅黑樹(自平衡的排序二叉樹)
Queue
  • PriorityQueue: Object[] 數組來實現二叉堆
  • ArrayQueue: Object[] 數組 + 雙指針
再來看看 Map 接口下面的集合 。
Map
  • HashMap: JDK1.8 之前 HashMap 由數組+鏈表組成的,數組是 HashMap 的主體,鏈表則是主要為了解決哈希沖突而存在的(“拉鏈法”解決沖突) 。JDK1.8 以后在解決哈希沖突時有了較大的變化,當鏈表長度大于閾值(默認為 8)(將鏈表轉換成紅黑樹前會判斷 , 如果當前數組的長度小于 64,那么會選擇先進行數組擴容 , 而不是轉換為紅黑樹)時 , 將鏈表轉化為紅黑樹,以減少搜索時間
  • LinkedHashMapLinkedHashMap 繼承自 HashMap,所以它的底層仍然是基于拉鏈式散列結構即由數組和鏈表或紅黑樹組成 。另外,LinkedHashMap 在上面結構的基礎上,增加了一條雙向鏈表,使得上面的結構可以保持鍵值對的插入順序 。同時通過對鏈表進行相應的操作,實現了訪問順序相關邏輯 。詳細可以查看:《LinkedHashMap 源碼詳細分析(JDK1.8)》(opens new window)
  • Hashtable: 數組+鏈表組成的,數組是 Hashtable 的主體,鏈表則是主要為了解決哈希沖突而存在的
  • TreeMap: 紅黑樹(自平衡的排序二叉樹)
4. 如何選用集合?主要根據集合的特點來選用 , 比如我們需要根據鍵值獲取到元素值時就選用

推薦閱讀