前言
歡迎關注公眾號:Coder程式設計 獲取最新原創技術文章和相關免費學習資料,隨時隨地學習技術知識!
本章主要介紹Collection集合相關知識,結合面試中會提到的相關問題進行知識點的梳理。希望能幫到大家~ 基於JDK1.8,如有錯誤,還望大家能夠指出!
涉及的Collection集合相關面試題
- 1.什麼是集合?
- 2.JAVA中集合型別都有哪些?有什麼特點?
- 3.說一說集合的父類Collection?
- 4.陣列和集合都有哪些區別?
- 5.說一說迭代器Iterator
- 6.Collection介面中幾種重要的類和介面簡介
1.什麼是集合?
來自百度百科的回答:
複製程式碼
- 集合類存放於java.util包中。
- 集合類存放的都是物件的引用,而非物件本身,出於表達上的便利,我們稱集合中的物件就是指集合中物件的引用(reference)。
- 集合型別主要有3種:set(集)、list(列表)和map(對映)。
- 集合介面分為:Collection和Map,list、set實現了Collection介面
2.JAVA中集合型別都有哪些?各有什麼特點?
Collection兩大體系:連結串列List、集合Set
List特點:元素有序;元素可以重複;元素都有索引(角標) List裡存放的物件是有序的,同時也是可以重複的,List關注的是索引,擁有一系列和索引相關的方法,查詢速度快。 因為往list集合裡插入或刪除資料時,會伴隨著後面資料的移動,所有插入刪除資料速度慢。
Set特點:元素無序;元素不可以重複; Set裡存放的物件是無序,不能重複的,集合中的物件不按特定的方式排序,只是簡單地把物件加入集合中。
同時集合中還有另外一種型別:Map(對映)。
Map特點:鍵值對;鍵不可以重複;值可以重複; Map集合中儲存的是鍵值對,鍵不能重複,值可以重複。根據鍵得到值,對map集合遍歷時先得到鍵的set集合,對set集合進行遍歷,得到相應的值。
3.說一說集合的父類Collection?
3.1 Collection 體系結構圖
Collection
List (有序集合,允許相同元素和null)
--LinkedList (非同步,允許相同元素和null,遍歷效率低插入和刪除效率高)
--ArrayList (非同步,允許相同元素和null,實現了動態大小的陣列,遍歷效率高,用的多)
--Vector(同步,允許相同元素和null,效率低)
---Stack(繼承自Vector,實現一個後進先出的堆疊)
Set (無序集合,不允許相同元素,最多有一個null元素)
--HashSet(無序集合,不允許相同元素,最多有一個null元素)
Map (沒有實現collection介面,key不能重複,value可以重複,一個key對映一個value)
--Hashtable (實現Map介面,同步,不允許null作為key和value,用自定義的類當作key的話要複寫hashCode和eques方法,)
--HashMap (實現Map介面,非同步,允許null作為key和value,用的多)
--WeakHashMap(實現Map介面)
複製程式碼
3.2 Collection 中的主要方法
(1)新增 boolean add(E o); boolean add(Collection<? extends E> c);
(2)刪除 boolean remove(Object o); boolean removeAll(Collection<? extends E> c)
void clear();
(3)判斷
a.判斷集合中是否有元素:boolean isEmpty();
b.判斷集合中是否包含某個元素:boolean contains(Object o);
c.判斷集合中是否包含某些元素:boolean contains(Collection<?> c);
(4)獲取 a.獲取集合中元素個數:int size(); b.遍歷集合中所有元素:Iterator iterator(); c.判斷兩個集合中是否存在相同的元素並保留兩個集合中相同的元素刪除不同的元素:boolean retainAll(Collection<?> c);
(5)其他 將集合中元素轉為陣列: a. Ojbect[] toArray(); b. T[] toArray(); 泛型
Java8新增方法 在 JDK 8 以後,Collection 介面還提供了從集合獲取連續的或者並行流: Stream stream() Stream parallelStream() 於Collection介面相關還有一個抽象類AbstractCollection: AbstractCollection是一個抽象類,實現了Collection介面的部分功能,實現了一些最基本的通用操作,把複雜的和業務相關的延遲到子類實現。 在AbstractCollection中,主要實現了contains(), isEmpty(), toArray(), remove(), clear() 這幾個操作。有興趣的同學可以自行研究下,邏輯都比較簡單。
特別注意:List介面擴充套件了一個一些方法,其中最重要,也是用的最多的是: E get(int index) 返回指定索引的元素
4.陣列和集合都有哪些區別?
陣列特點:
- 陣列本質上就是一段連續的記憶體空間,用於記錄多個型別相同的資料;
- 資料一旦宣告完畢,則記憶體空間固定不變;
- 插入和刪除操作不方便,可能會移動大量的元素並導致效率太低;
- 支援下標訪問,可以實現隨機訪問;
- 陣列中的元素可以是基本資料型別,也可以使用引用資料型別。
集合特點:
- 記憶體空間可以不連續,資料型別可以不相同;
- 集合的記憶體空間可以動態的調整;
- 集合的插入刪除操作可以不移動大量元素;
- 部分支援下標訪問,部分不支援;
- 集合中的元素必須是引用資料型別(你儲存的是簡單的int,它會自動裝箱成Integer);
可以看出陣列和集合在資料的儲存,訪問,型別,長度等都有不同的地方。
5.說一說迭代器 Iterator?
- 通過集合物件獲取其對應的Iterator物件
- 判斷是否存在下一個元素
- 取出該元素並將迭代器物件指向下一個元素 Iterator iterator():取出元素的方式:迭代器。該物件必須依賴於具體容器,因為每一個容器的資料結構都不同。 所以該迭代器物件是在容器中進行內部實現的。對於使用容器者而言,具體的實現不重要,只要通過容器獲取到該實現的迭代器的物件即可,也就是iterator方法。
擴充套件知識: ArrayList裡面的iterator方法採用了設計模式中的——工廠方法模式! 有興趣的同學可以後續看到我另外的文章“設計模式精講”專欄。
6.Collection介面中幾種重要的類和介面簡介?
該問題與第二個問題類似~ 後續文章會有更詳細的介紹!
Collection兩大體系:連結串列List、集合Set 另對映Map
List介面及子類介紹
List是有序的Collection,使用此介面能夠精確的控制每個元素插入的位置。使用者能夠使用索引(元素在List中的位置,類似於陣列下標)來訪問List中的元素,這類似於Java的陣列。 和下面要提到的Set不同,List允許有相同的元素。 除了具有Collection介面必備的iterator()方法外,List還提供一個listIterator()方法,返回一個ListIterator介面,和標準的Iterator介面相比,ListIterator多了一些add()之類的方法,允許新增,刪除,設定元素,還能向前或向後遍歷。
實現List介面的常用類有:
- LinkedList類 (底層資料結構是連結串列,執行緒不安全)
- ArrayList類 (底層資料結構是陣列,執行緒不安全)
- Vector類 (底層資料結構是陣列,執行緒安全)
- Stack類 (顧名思義:棧,繼承至Vector類並進行擴充套件)
在後續的文章中我們將一一詳細介紹這些類的相關特性!
Set介面及子類介紹
Set是一種不包含重複的元素的Collection,即任意的兩個元素e1和e2都有e1.equals(e2)=false,Set最多有一個null元素。很明顯,Set的建構函式有一個約束條件,傳入的Collection引數不能包含重複的元素。 注意:必須小心操作可變物件(Mutable Object)。如果一個Set中的可變元素改變了自身狀態導致Object.equals(Object)=true將導致一些問題。
實現Set介面的常用類有:
- HashSet類 (底層資料結構是陣列+單連結串列+紅黑樹,無序)
- LinkedHashSet (底層資料結構是陣列+單連結串列+紅黑樹+雙向連結串列,無序)
- TreeSet類 (底層資料結構紅黑樹,有序)
在後續的文章中我們將一一詳細介紹這些類的相關特性!
Map介面及子類介紹 注意:Map沒有繼承Collection介面,Map提供key到value的對映。一個Map中不能包含相同的key,每個key只能對映一個value。
Map介面提供3種集合的檢視,Map的內容可以被當作一組key集合,一組value集合,或者一組key-value對映。
- Hashtable類
- HashMap類
在後續的文章中我們將一一詳細介紹這些類的相關特性!
文末
本章節介紹了Collection介面中的大部分可能在面試過程中會出現的內容, 並沒有詳細去介紹其子類及其實現相關的原理。這方面的內容會放在後續的章節中去詳細介紹。 歡迎關注公眾號:Coder程式設計 獲取最新原創技術文章和相關免費學習資料,隨時隨地學習技術知識!