溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

通過(guò)面試題,讓我們來(lái)了解Collection

發(fā)布時(shí)間:2020-08-17 10:55:44 來(lái)源:網(wǎng)絡(luò) 閱讀:152 作者:Coder編程 欄目:編程語(yǔ)言

前言

歡迎關(guān)注公眾號(hào):Coder編程
獲取最新原創(chuàng)技術(shù)文章和相關(guān)免費(fèi)學(xué)習(xí)資料,隨時(shí)隨地學(xué)習(xí)技術(shù)知識(shí)!**

本章主要介紹Collection集合相關(guān)知識(shí),結(jié)合面試中會(huì)提到的相關(guān)問(wèn)題進(jìn)行知識(shí)點(diǎn)的梳理。希望能幫到大家~
基于JDK1.8,如有錯(cuò)誤,還望大家能夠指出!

涉及的Collection集合相關(guān)面試題

  • 1.什么是集合?
  • 2.AVA中集合類型都有哪些?有什么特點(diǎn)?
  • 3.說(shuō)一說(shuō)集合的父類Collection?
  • 4.數(shù)組和集合都有哪些區(qū)別?
  • 5.說(shuō)一說(shuō)迭代器Iterator
  • 6.Collection接口中幾種重要的類和接口簡(jiǎn)介

1.什么是集合?

 來(lái)自百度百科的回答:
  1. 集合類存放于java.util包中。
  2. 集合類存放的都是對(duì)象的引用,而非對(duì)象本身,出于表達(dá)上的便利,我們稱集合中的對(duì)象就是指集合中對(duì)象的引用(reference)。
  3. 集合類型主要有3種:set(集)、list(列表)和map(映射)。
  4. 集合接口分為:Collection和Map,list、set實(shí)現(xiàn)了Collection接口

2.JAVA中集合類型都有哪些?各有什么特點(diǎn)?

Collection兩大體系:鏈表List、集合Set

List特點(diǎn):元素有序;元素可以重復(fù);元素都有索引(角標(biāo))
List里存放的對(duì)象是有序的,同時(shí)也是可以重復(fù)的,List關(guān)注的是索引,擁有一系列和索引相關(guān)的方法,查詢速度快。
因?yàn)橥鵯ist集合里插入或刪除數(shù)據(jù)時(shí),會(huì)伴隨著后面數(shù)據(jù)的移動(dòng),所有插入刪除數(shù)據(jù)速度慢。

Set特點(diǎn):元素?zé)o序;元素不可以重復(fù);
Set里存放的對(duì)象是無(wú)序,不能重復(fù)的,集合中的對(duì)象不按特定的方式排序,只是簡(jiǎn)單地把對(duì)象加入集合中。

同時(shí)集合中還有另外一種類型:Map(映射)。

Map特點(diǎn):鍵值對(duì);鍵不可以重復(fù);值可以重復(fù);
Map集合中存儲(chǔ)的是鍵值對(duì),鍵不能重復(fù),值可以重復(fù)。根據(jù)鍵得到值,對(duì)map集合遍歷時(shí)先得到鍵的set集合,對(duì)set集合進(jìn)行遍歷,得到相應(yīng)的值。

3.說(shuō)一說(shuō)集合的父類Collection?

3.1 Collection 體系結(jié)構(gòu)圖

通過(guò)面試題,讓我們來(lái)了解Collection

Collection

List (有序集合,允許相同元素和null)
  --LinkedList (非同步,允許相同元素和null,遍歷效率低插入和刪除效率高)
  --ArrayList (非同步,允許相同元素和null,實(shí)現(xiàn)了動(dòng)態(tài)大小的數(shù)組,遍歷效率高,用的多)
  --Vector(同步,允許相同元素和null,效率低)
   ---Stack(繼承自Vector,實(shí)現(xiàn)一個(gè)后進(jìn)先出的堆棧)

Set (無(wú)序集合,不允許相同元素,最多有一個(gè)null元素)
  --HashSet(無(wú)序集合,不允許相同元素,最多有一個(gè)null元素)

Map (沒(méi)有實(shí)現(xiàn)collection接口,key不能重復(fù),value可以重復(fù),一個(gè)key映射一個(gè)value)
  --Hashtable (實(shí)現(xiàn)Map接口,同步,不允許null作為key和value,用自定義的類當(dāng)作key的話要復(fù)寫(xiě)hashCode和eques方法,)
  --HashMap (實(shí)現(xiàn)Map接口,非同步,允許null作為key和value,用的多)
  --WeakHashMap(實(shí)現(xiàn)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.判斷集合中是否包含某個(gè)元素:boolean contains(Object o);
c.判斷集合中是否包含某些元素:boolean contains(Collection<?> c);

(4)獲取
a.獲取集合中元素個(gè)數(shù):int size();
b.遍歷集合中所有元素:Iterator<E> iterator();
c.判斷兩個(gè)集合中是否存在相同的元素并保留兩個(gè)集合中相同的元素刪除不同的元素:boolean retainAll(Collection<?> c);

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

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

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

4.數(shù)組和集合都有哪些區(qū)別?

數(shù)組特點(diǎn):

  1. 數(shù)組本質(zhì)上就是一段連續(xù)的內(nèi)存空間,用于記錄多個(gè)類型相同的數(shù)據(jù);
  2. 數(shù)據(jù)一旦聲明完畢,則內(nèi)存空間固定不變;
  3. 插入和刪除操作不方便,可能會(huì)移動(dòng)大量的元素并導(dǎo)致效率太低;
  4. 支持下標(biāo)訪問(wèn),可以實(shí)現(xiàn)隨機(jī)訪問(wèn);
  5. 數(shù)組中的元素可以是基本數(shù)據(jù)類型,也可以使用引用數(shù)據(jù)類型。

集合特點(diǎn):

  1. 內(nèi)存空間可以不連續(xù),數(shù)據(jù)類型可以不相同;
  2. 集合的內(nèi)存空間可以動(dòng)態(tài)的調(diào)整;
  3. 集合的插入刪除操作可以不移動(dòng)大量元素;
  4. 部分支持下標(biāo)訪問(wèn),部分不支持;
  5. 集合中的元素必須是引用數(shù)據(jù)類型(你存儲(chǔ)的是簡(jiǎn)單的int,它會(huì)自動(dòng)裝箱成Integer);

可以看出數(shù)組和集合在數(shù)據(jù)的存儲(chǔ),訪問(wèn),類型,長(zhǎng)度等都有不同的地方。

5.說(shuō)一說(shuō)迭代器 Iterator?

  1. 通過(guò)集合對(duì)象獲取其對(duì)應(yīng)的Iterator對(duì)象
  2. 判斷是否存在下一個(gè)元素
  3. 取出該元素并將迭代器對(duì)象指向下一個(gè)元素
    Iterator iterator():取出元素的方式:迭代器。該對(duì)象必須依賴于具體容器,因?yàn)槊恳粋€(gè)容器的數(shù)據(jù)結(jié)構(gòu)都不同。
    所以該迭代器對(duì)象是在容器中進(jìn)行內(nèi)部實(shí)現(xiàn)的。對(duì)于使用容器者而言,具體的實(shí)現(xiàn)不重要,只要通過(guò)容器獲取到該實(shí)現(xiàn)的迭代器的對(duì)象即可,也就是iterator方法。

擴(kuò)展知識(shí):
ArrayList里面的iterator方法采用了設(shè)計(jì)模式中的——工廠方法模式!
有興趣的同學(xué)可以后續(xù)看到我另外的文章“設(shè)計(jì)模式精講”專欄。

6.Collection接口中幾種重要的類和接口簡(jiǎn)介?

該問(wèn)題與第二個(gè)問(wèn)題類似~ 后續(xù)文章會(huì)有更詳細(xì)的介紹!

Collection兩大體系:鏈表List、集合Set 另映射Map

List接口及子類介紹

  List是有序的Collection,使用此接口能夠精確的控制每個(gè)元素插入的位置。用戶能夠使用索引(元素在List中的位置,類似于數(shù)組下標(biāo))來(lái)訪問(wèn)List中的元素,這類似于Java的數(shù)組。 和下面要提到的Set不同,List允許有相同的元素。 除了具有Collection接口必備的iterator()方法外,List還提供一個(gè)listIterator()方法,返回一個(gè)ListIterator接口,和標(biāo)準(zhǔn)的Iterator接口相比,ListIterator多了一些add()之類的方法,允許添加,刪除,設(shè)定元素,還能向前或向后遍歷。

  實(shí)現(xiàn)List接口的常用類有:

  • LinkedList類 (底層數(shù)據(jù)結(jié)構(gòu)是鏈表,線程不安全)
  • ArrayList類 (底層數(shù)據(jù)結(jié)構(gòu)是數(shù)組,線程不安全)
  • Vector類 ?。ǖ讓訑?shù)據(jù)結(jié)構(gòu)是數(shù)組,線程安全)
  • Stack類 (顧名思義:棧,繼承至Vector類并進(jìn)行擴(kuò)展)
    在后續(xù)的文章中我們將一一詳細(xì)介紹這些類的相關(guān)特性!

Set接口及子類介紹

  Set是一種不包含重復(fù)的元素的Collection,即任意的兩個(gè)元素e1和e2都有e1.equals(e2)=false,Set最多有一個(gè)null元素。很明顯,Set的構(gòu)造函數(shù)有一個(gè)約束條件,傳入的Collection參數(shù)不能包含重復(fù)的元素。   
注意:必須小心操作可變對(duì)象(Mutable Object)。如果一個(gè)Set中的可變?cè)馗淖兞俗陨頎顟B(tài)導(dǎo)致Object.equals(Object)=true將導(dǎo)致一些問(wèn)題。

  實(shí)現(xiàn)Set接口的常用類有:

  • HashSet類 (底層數(shù)據(jù)結(jié)構(gòu)是數(shù)組+單鏈表+紅黑樹(shù),無(wú)序)
  • LinkedHashSet (底層數(shù)據(jù)結(jié)構(gòu)是數(shù)組+單鏈表+紅黑樹(shù)+雙向鏈表,無(wú)序)
  • TreeSet類 (底層數(shù)據(jù)結(jié)構(gòu)紅黑樹(shù),有序)
    在后續(xù)的文章中我們將一一詳細(xì)介紹這些類的相關(guān)特性!

Map接口及子類介紹
注意:Map沒(méi)有繼承Collection接口,Map提供key到value的映射。一個(gè)Map中不能包含相同的key,每個(gè)key只能映射一個(gè)value。

Map接口提供3種集合的視圖,Map的內(nèi)容可以被當(dāng)作一組key集合,一組value集合,或者一組key-value映射。

  • Hashtable類
  • HashMap類   
    在后續(xù)的文章中我們將一一詳細(xì)介紹這些類的相關(guān)特性!

文末

本章節(jié)介紹了Collection接口中的大部分可能在面試過(guò)程中會(huì)出現(xiàn)的內(nèi)容,
并沒(méi)有詳細(xì)去介紹其子類及其實(shí)現(xiàn)相關(guān)的原理。這方面的內(nèi)容會(huì)放在后續(xù)的章節(jié)中去詳細(xì)介紹。
歡迎關(guān)注公眾號(hào):Coder編程
獲取最新原創(chuàng)技術(shù)文章和相關(guān)免費(fèi)學(xué)習(xí)資料,隨時(shí)隨地學(xué)習(xí)技術(shù)知識(shí)!
通過(guò)面試題,讓我們來(lái)了解Collection

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI