Java 集合基礎面試


1、Java集合有哪些?

1)按照實現(xiàn)接口分類
1.1)實現(xiàn)Map接口得有:EnumMap、IdentityHashMap、HashMap、LinkedHashMap、WeakHashMap、TreeMap
1.2)實現(xiàn)List接口的有:ArrayList、LinkedList
1.3)實現(xiàn)Set接口的有:HashSet、LinkedHashSet、TreeSet
1.4)實現(xiàn)Queue接口的有:PriorityQueue、LinkedList、ArrayQueue

2)按照底層實現(xiàn)的數(shù)據(jù)結(jié)構(gòu)分類
2.1)底層以數(shù)組的形式實現(xiàn):EnumMap、ArrayList、ArrayQueue
2.2)底層以鏈表的形式實現(xiàn):LinkedHashSet、LinkedList、LinkedHashMap
2.3)底層以紅黑樹的形式實現(xiàn):TreeMap、TreeSet
2.4) 底層以哈希表的形式實現(xiàn):HashMap、HashSet、LinkedHashMap、LinkedHashSet、WeakHashMap、IdentityHashMap
2.5)底層以二叉樹的形式實現(xiàn):PriorityQueue

3)并發(fā)容器
3.1)ConcurrentHashMap、ConCurrentSkipListHashMap
3.2)LinkedTransferQueue、CopyOnWriteArrayList、ArrayBlockingQueue、LinkeBlockingQueue、PriorityBlockingQueue、LinkedBlockQueue、DelayQueue、SynchronusQueue
3.3)ConcurrentSkipListSet、CopyOnWriteArraySet

2、Collection和Collections有什么區(qū)別?

Collection是集合類的上級接口,繼承與它有關(guān)的接口主要有List和Set;
Collections是一個包裝類。它包含有各種有關(guān)集合操作的靜態(tài)多態(tài)方法,不能實例化,像一個Collection集合框架中的工具類。

3、List、Set、Map 之間的區(qū)別是什么?

List:
1、可以允許重復的對象。
2、可以插入多個null元素。
3、是一個有序容器,保持了每個元素的插入順序,輸出的順序就是插入的順序。
4、常用的實現(xiàn)類有 ArrayList、LinkedList 和 Vector。ArrayList 最為流行,它提供了使用索引的隨意訪問,而 LinkedList 則對于經(jīng)常需要從 List 中添加或刪除元素的場合更為合適。

Set:
1、不允許重復對象
2、無序容器,你無法保證每個元素的存儲順序,TreeSet通過 Comparator 或者 Comparable 維護了一個排序順序。
3、只允許一個 null 元素
4、Set 接口最流行的幾個實現(xiàn)類是 HashSet、LinkedHashSet 以及 TreeSet。最流行的是基于 HashMap 實現(xiàn)的 HashSet;TreeSet 還實現(xiàn)了 SortedSet 接口,因此 TreeSet 是一個根據(jù)其 compare() 和 compareTo() 的定義進行排序的有序容器。

Map:
1、Map不是collection的子接口或者實現(xiàn)類。Map是一個接口。
2、Map 的 每個 Entry 都持有兩個對象,也就是一個鍵一個值,Map 可能會持有相同的值對象但鍵對象必須是唯一的。
3、TreeMap 也通過 Comparator 或者 Comparable 維護了一個排序順序。
4、Map 里你可以擁有隨意個 null 值但最多只能有一個 null 鍵。
5、Map 接口最流行的幾個實現(xiàn)類是 HashMap、LinkedHashMap、Hashtable 和 TreeMap。(HashMap、TreeMap最常用)

4、HashMap 和 Hashtable 有什么區(qū)別?

1)繼承的父類不同
Hashtable繼承自Dictionary類,而HashMap繼承自AbstractMap類。但二者都實現(xiàn)了Map接口。

2)線程安全性不同
Hashtable中的方法是Synchronize的,而HashMap中的方法在缺省情況下是非Synchronize的。在多線程并發(fā)的環(huán)境下,可以直接使用Hashtable,不需要自己為它的方法實現(xiàn)同步,但使用HashMap時就必須要自己增加同步處理。

3)key和value是否允許為null值
Hashtable中,key和value都不允許出現(xiàn)null值,而HashMap中,null可以作為鍵,這樣的鍵只有一個,但是可以有一個或多個鍵所對應的值為null。

4)內(nèi)部實現(xiàn)使用的數(shù)組初始化化和擴容方式不同
1)HashTable在不指定容量的情況下的默認容量為11,而HashMap為16,
2)Hashtable不要求底層數(shù)組的容量一定要為2的整數(shù)次冪,而HashMap則要求一定為2的整數(shù)次冪。
3)Hashtable擴容時,將容量變?yōu)樵瓉淼?倍加1,而HashMap擴容時,將容量變?yōu)樵瓉淼?倍。

5)hash的計算方式不同
HashMap計算了hash值;Hashtable使用了key的hashCode方法。

6)是否有contains方法
HashMap沒有contains方法;Hashtable包含contains方法,類似于containsValue。

5、ArrayList和LinkedList有什么區(qū)別?

1)數(shù)據(jù)結(jié)構(gòu)實現(xiàn)
ArrayList底層是用數(shù)組實現(xiàn)的,而LinkedList底層是用雙向鏈表實現(xiàn)的;

2)隨機訪問效率
正因為ArrayList是通過數(shù)組實現(xiàn)的,而數(shù)組的元素是帶有下標的,查詢的時候可以通過下標快速定位到所要查詢的元素,而LinkedList 基于雙向鏈表實現(xiàn)的,每次查詢都必須從頭結(jié)點移動指針從前往后依次查找直至查找到所要查找的元素,因此ArrayList的隨機訪問效率比LinkedList效率高;

3)增加和刪除效率
在非尾的增加和刪除操作,LinkedList 要比 ArrayList 效率要高,因為ArrayList底層是基于數(shù)組實現(xiàn)的,而數(shù)組是一塊連續(xù)的內(nèi)存空間,當我們在中間刪除一個元素時,我們都必須逐一將所要刪除的元素的后面元素逐一向前移一位,操作繁瑣,而LinkedList增加或者刪除元素,只需要將所要刪除的元素的上一個元素的后驅(qū)指針指向指向下下一個元素,也就是node.next = node.next.next;

在需要頻繁讀取集合中的元素時,更推薦使用ArrayList,而在插入和刪除操作較多時,更推薦使用LinkedList。

6、Array和ArrayList有什么區(qū)別?

1)Array類型的變量在聲明的同時必須進行實例化(至少得初始化數(shù)組的大小,而ArrayList可以只是先聲明。
2)Array只能存儲類型相同的對象,而ArrayList可以存儲不同的對象。
3)Array能存儲基本數(shù)據(jù)類型類型和對象類型,而ArrayList只能包含對象類型。
4)Array大小是固定的,ArrayList 的大小是動態(tài)變化的。

7、ArrayList和Vector的區(qū)別和聯(lián)系?

相同點:
1)底層都使用數(shù)組實現(xiàn);
2)功能相同,實現(xiàn)增刪改查等操作的方法相似;
3)長度可變的數(shù)組結(jié)構(gòu);

不同點:
1)Vector是早期JDK版本提供,ArrayList是新版本替代Vector的;
2)Vector 的方法都是同步的,線程安全;ArrayList 非線程安全,但性能比Vector好;
3)默認初始化容量都是10,Vector 擴容默認會翻倍,可指定擴容的大?。籄rrayList只增加 50%。

8、迭代器Iterator是什么?

1)首先說一下迭代器模式,它是 Java 中常用的設計模式之一。用于順序訪問集合對象的元素,無需知道集合對象的底層實現(xiàn)。
2)Iterator 是可以遍歷集合的對象,為各種容器提供了公共的操作接口,隔離對容器的遍歷操作和底層實現(xiàn),從而解耦。
3)缺點是增加新的集合類需要對應增加新的迭代器類,迭代器類與集合類成對增加。

9、HashMap的鍵值需要注意什么?

HashMap 的 key 相等的條件是,條件 1 必須滿足,條件2和3必須滿足一個。

1)key 的 hash 值相等

2)內(nèi)存中是同一個對象,即使用 == 判斷 key 相等

3)key 不為 null, 且使用 equals 判斷 key 相等

所以自定義類作為 HashMap 的 key,需要注意按照自己的設計邏輯,重寫自定義類的 hashCode() 方法和 equals() 方法。

10、HashMap的實現(xiàn)原理是什么?

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

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

image.png

實現(xiàn)原理:

1)利用key的hashCode重新hash計算出當前對象的元素在數(shù)組中的下標;

2)存儲時,如果出現(xiàn)hash值相同的key,此時有兩種情況:

1、如果key相同,則覆蓋原始值;

2、如果key不同(出現(xiàn)沖突),則將當前的key-value放入鏈表中;

3)獲取時,直接找到hash值對應的下標,在進一步判斷key是否相同,從而找到對應值;

4)理解了以上過程就不難明白HashMap是如何解決hash沖突的問題,核心就是使用了數(shù)組的存儲方式,然后將沖突的key的對象放入鏈表中,一旦發(fā)現(xiàn)沖突就在鏈表中做進一步的對比。

11、HashSet實現(xiàn)原理是什么?有什么特點?**

1)HashSet 是基于 HashMap 實現(xiàn)的,查詢速度特別快

2)HashMap 是支持 key 為 null 值的,所以 HashSet 支持添加null 值

3)HashSet 存放自定義類時,自定義類需要重寫 hashCode() 和 equals() 方法,確保集合對自定義類的對象的唯一性判斷(具體判斷邏輯,見 HashMap put() 方法,簡單概括就是 key 進行 哈希。判斷元素 hash 值是否相等、key 是否為同個對象、key 是否 equals。第 1 個條件為 true,2、3 有一個為 true,HashMap 即認為 key 相同)

4)無序、不可重復。

12、那些集合類是線程安全的?

1)Vector

2)Stack

3)Hashtable

4)java.util.concurrent 包下所有的集合類 ArrayBlockingQueue、ConcurrentHashMap、ConcurrentLinkedQueue、ConcurrentLinkedDeque...

13、怎么確保一個集合不能被修改?

使用 JDK中java.util.Collections 類,unmodifiable*** 方法賦值原集合

1)list = Collections.unmodifiableList(list);

2)set = Collections.unmodifiableSet(set);

3)map = Collections.unmodifiableMap(map);

當再修改集合時,會報錯 java.lang.UnsupportedOperationException。從而確保自己定義的集合不被其他人修改。

未完待續(xù)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

  • Java集合類可用于存儲數(shù)量不等的對象,并可以實現(xiàn)常用的數(shù)據(jù)結(jié)構(gòu)如棧,隊列等,Java集合還可以用于保存具有映射關(guān)...
    小徐andorid閱讀 2,089評論 0 13
  • ArrayList實現(xiàn)原理要點概括 參考文獻:http://zhangshixi.iteye.com/blog/6...
    晨光光閱讀 1,168評論 0 1
  • 原文地址 Java集合 Java集合框架:是一種工具類,就像是一個容器可以存儲任意數(shù)量的具有共同屬性的對象。 Ja...
    gyl_coder閱讀 1,040評論 0 8
  • 1.Java集合框架是什么?說出一些集合框架的優(yōu)點? 每種編程語言中都有集合,最初的Java版本包含幾種集合類:V...
    胖先森閱讀 844評論 4 17
  • 1.Java集合框架是什么?說出一些集合框架的優(yōu)點? 每種編程語言中都有集合,最初的Java版本包含幾種集合類:V...
    Oneisall_81a5閱讀 962評論 0 10

友情鏈接更多精彩內(nèi)容