2019 Java面試問題及答案詳解(二)Java容器

話不多說,直接上整理後的乾貨,希望對初學者或不熟悉這類問題的讀者有些許幫助!

1.java 容器都有哪些?

數組,String,java.util下的集合容器(Collection和Map)

2.Collection 和 Collections 有什麼區別?

Collections是個java.util下的類,它包含有各種有關集合操作的靜態方法。

Collection是個java.util下的接口,它是各種集合結構的父接口。

3.List、Set、Map 之間的區別是什麼?

List、Set是實現了Collection接口的子接口;而Map是另一個集合接口;(Collection接口和Map接口是平級的)

2019 Java面試問題及答案詳解(二)Java容器/集合篇

三者之間的區別如下:

1) 元素重複性:

① List允許有重複的元素。任何數量的重複元素都可以在不影響現有重複元素的值及其索引的情況下插入到List集合中;

② Set集合不允許元素重複。Set以及所有實現了Set接口的類都不允許重複值的插入,若多次插入同一個元素時,在該集合中只顯示一個;

③ Map以鍵值對的形式對元素進行存儲。Map不允許有重複鍵,但允許有不同鍵對應的重複的值;

2) 元素的有序性:

① List及其所有實現類保持了每個元素的插入順序;

② Set中的元素都是無序的;但是某些Set的實現類以某種殊形式對其中的元素進行排序,如:LinkedHashSet按照元素的插入順序進行排序;

③ Map跟Set一樣對元素進行無序存儲,但其某些實現類對元素進行了排序。如:TreeMap根據鍵對其中的元素進行升序排序;

3) 元素是否為空值:

① List允許任意數量的空值;

② Set最多允許一個空值的出現;[ 當向Set集合中添加多個null值時,在該Set集合中只會顯示一個null元素]

③ Map只允許出現一個空鍵,但允許出現任意數量的空值;

總結:

List中的元素,有序、可重複、可為空;

Set中的元素,無序、不重複、只有一個空元素;

Map中的元素,無序、鍵不重,值可重、可一個空鍵、多可空值;

實現類:

① List:ArrayList、LinkedList;

② Set:HashSet、LinkedHashSet、TreeSet、SortedSet等等;

③ Map:HashMap、TreeMap、WeakHashMap、LinkedHashMap、IdentityHashMap等等;

4.List集合的子類ArrayList、Vector、LinkedList之間的區別

ArrayList和Vector都是以數組的方式存儲數據的,此數組長度大於實際存儲元素個數,以方便插入元素;

它們都允許直接按索引獲取元素;

由於在插入數據時,涉及到數組元素的移動等內存操作,所以在插入數據時執行速度較慢;

Vector是線程安全的(synchronized),所以性能上要比ArrayList差;

而LinkedList是以雙向鏈表的形式存儲數據的,在按索引獲取數據時只需要向前或者向後進行遍歷即可;

在插入數據時,只需要記錄本項的前後項即可,所以插入速度較快。

5.HashMap和HashTable的區別:

HashMap是HashTable的輕量級實現(非線程安全的實現),它們都實現了Map接口,主要區別在於HashMap允許空(null)鍵值(key),由於非線程安全,效率上高於HashTable。

HashMap允許將null作為一個entry的key或者value,而HashTable不允許。

HashMap去掉了HashTable的contains方法,改成containsValue和containsKey方法。

二者最大的不同是,HashTable的方法是synchronized(線程安全的),而HashMap不是,在多個線程訪問HashTable時,不需要自己為它的方法實現同步,而HashMap就必須為之提供外同步。

6.HashMap 的實現原理

HashMap是基於哈希表的Map接口的非同步實現。此實現提供所有可選的映射操作,並允許使用null值和null鍵。此類不保證映射的順序,特別是它不保證該順序恆久不變。

在java編程語言中,最基本的結構就是兩種,一個是數組,另外一個是模擬指針(引用),所有的數據結構都可以用這兩個基本結構來構造的,HashMap也不例外。HashMap實際上是一個“鏈表散列”的數據結構,即數組和鏈表的結合體。

HashMap底層就是一個數組結構,數組中的每一項又是一個鏈表。當新建一個HashMap的時候,就會初始化一個數組。

7.HashSet 的實現原理

對於HashSet而言,它是基於HashMap實現的,HashSet底層使用HashMap來保存所有元素,因此HashSet 的實現比較簡單,相關HashSet的操作,基本上都是直接調用底層HashMap的相關方法來完成。

8.在 Queue 中 poll()和 remove()有什麼區別

remove()和poll()方法刪除並返回隊列的頭。

remove()和poll()方法在隊列為空時的行為不同: remove()方法拋出異常,而poll()方法返回null 。

除了上面的區別還有一下幾點區別:

offer()和add()的區別:

add()和offer()都是向隊列中添加一個元素。但是如果想在一個滿的隊列中加入一個新元素,調用 add() 方法就會拋出一個 unchecked 異常,而調用 offer() 方法會返回 false。可以據此在程序中進行有效的判斷!

peek()和element()的區別:

peek()和element()都將在不移除的情況下返回隊頭,但是peek()方法在隊列為空時返回null,調用element()方法會拋出NoSuchElementException異常

9.哪些集合類是線程安全的

Vector:就比Arraylist多了個同步化機制(線程安全)

Hashtable:就比Hashmap多了個線程安全。

ConcurrentHashMap:是一種高效但是線程安全的集合

10. Iterator 怎麼使用?有什麼特點?

迭代其實可以簡單地理解為遍歷,是一個標準化遍歷各類容器裡面的所有對象的方法類.。

最常用的就是集合內部遍歷有刪除操作時(例如ArrayList遍歷時需要刪除特定元素),一定要通過iterator來刪除。

11.Iterator 和 ListIterator 有什麼區別?

ListIterator和Iterator都有hasNext()和next()方法,可以實現順序向後遍歷。但是ListIterator有hasPrevious()和previous()方法,可以實現逆向(順序向前)遍歷。Iterator就不可以。

ListIterator可以定位當前的索引位置,nextIndex()和previousIndex()可以實現。Iterator 沒有此功能。

ListIterator有add()方法,可以向List中插入對象,而Iterator不能。

都可實現刪除對象,但是ListIterator可以實現對象的修改,set()方法可以實現。Iterator僅能遍歷,不能修改。因為ListIterator的這些功能,可以實現對LinkedList等List數據結構的操作。

12.怎麼確保一個集合不能被修改?

Collections.unmodifiableList(List)

Collections.unmodifiableMap(Map)

Collections.unmodifiableSet(Set)

以上返回的集合對象都是不可修改的,調用修改方法會拋出異常UnsupportedOperationException

2019 Java面試問題及答案詳解(二)Java容器/集合篇

結束語:好了,本期總結java容器集合的常用知識點到此就結束了,下一章節我們再來介紹下Java多線程相關知識點。期待您的加入,共同學習新知識共同鞏固舊知識共同探討不同的問題。


分享到:


相關文章: