1. 程式人生 > >通過面試題,讓我們來了解Collection

通過面試題,讓我們來了解Collection

引用 兩個 https get 工廠 泛型 大量 對象 和集

前言

歡迎關註公眾號:Coder編程
獲取最新原創技術文章和相關免費學習資料,隨時隨地學習技術知識!**

本章主要介紹Collection集合相關知識,結合面試中會提到的相關問題進行知識點的梳理。希望能幫到大家~
基於JDK1.8,如有錯誤,還望大家能夠指出!

涉及的Collection集合相關面試題

  • 1.什麽是集合?
  • 2.AVA中集合類型都有哪些?有什麽特點?
  • 3.說一說集合的父類Collection?
  • 4.數組和集合都有哪些區別?
  • 5.說一說叠代器Iterator
  • 6.Collection接口中幾種重要的類和接口簡介

1.什麽是集合?

 來自百度百科的回答:
  1. 集合類存放於java.util包中。
  2. 集合類存放的都是對象的引用,而非對象本身,出於表達上的便利,我們稱集合中的對象就是指集合中對象的引用(reference)。
  3. 集合類型主要有3種:set(集)、list(列表)和map(映射)。
  4. 集合接口分為: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<E> iterator();
c.判斷兩個集合中是否存在相同的元素並保留兩個集合中相同的元素刪除不同的元素:boolean retainAll(Collection<?> c);

(5)其他
將集合中元素轉為數組:
a. Ojbect[] toArray();
b. <T> T[] toArray(); 泛型

Java8新增方法
在 JDK 8 以後,Collection 接口還提供了從集合獲取連續的或者並行流:
Stream<E> stream()
Stream<E> parallelStream()
於Collection接口相關還有一個抽象類AbstractCollection:
AbstractCollection是一個抽象類,實現了Collection接口的部分功能,實現了一些最基本的通用操作,把復雜的和業務相關的延遲到子類實現。
在AbstractCollection中,主要實現了contains(), isEmpty(), toArray(), remove(), clear() 這幾個操作。有興趣的同學可以自行研究下,邏輯都比較簡單。

特別註意:List接口擴展了一個一些方法,其中最重要,也是用的最多的是:
E get(int index) 返回指定索引的元素

4.數組和集合都有哪些區別?

數組特點:

  1. 數組本質上就是一段連續的內存空間,用於記錄多個類型相同的數據;
  2. 數據一旦聲明完畢,則內存空間固定不變;
  3. 插入和刪除操作不方便,可能會移動大量的元素並導致效率太低;
  4. 支持下標訪問,可以實現隨機訪問;
  5. 數組中的元素可以是基本數據類型,也可以使用引用數據類型。

集合特點:

  1. 內存空間可以不連續,數據類型可以不相同;
  2. 集合的內存空間可以動態的調整;
  3. 集合的插入刪除操作可以不移動大量元素;
  4. 部分支持下標訪問,部分不支持;
  5. 集合中的元素必須是引用數據類型(你存儲的是簡單的int,它會自動裝箱成Integer);

可以看出數組和集合在數據的存儲,訪問,類型,長度等都有不同的地方。

5.說一說叠代器 Iterator?

  1. 通過集合對象獲取其對應的Iterator對象
  2. 判斷是否存在下一個元素
  3. 取出該元素並將叠代器對象指向下一個元素
    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編程
獲取最新原創技術文章和相關免費學習資料,隨時隨地學習技術知識!
技術分享圖片

通過面試題,讓我們來了解Collection