Java集合類--超詳細整理

目錄

1.什麼是Java集合類?

1.1 什麼是Java集合API?

1.2 什麼是Iterator?

2.集合和數組的區別

3.Collection集合的方法

4.常用集合的分類(總結)

4.1 List和Set集合詳解

4.2 Map詳解

由於近期面試都或多或少提到了集合類,可見其重要性和實用性,於是結合以前的知識,參考了一些博客和貼吧論壇,整理了以下筆記並且優化了以下排版,有一些簡單易懂的圖片也借鑑了一下,主要講解的是各個具體實現類的特性,結構優缺點等等。本文用於學習交流,若有不足之處,請指正。


1.什麼是Java集合類?

集合類是Java數據結構的實現。Java的集合類是java.util包中的重要內容,它允許以各種方式將元素分組,並定義了各種使這些元素更容易操作的方法。Java集合類是Java將一些基本的和使用頻率極高的基礎類進行封裝和增強後再以一個類的形式提供。集合類是可以往裏面保存多個對象的類,存放的是對象,不同的集合類有不同的功能和特點,適合不同的場合,用以解決一些實際問題。

框架圖:

 

1.1 什麼是Java集合API?

  Java集合框架API是用來表示和操作集合的統一框架,它包含接口、實現類、以及幫助程序員完成一些編程的算法。簡言之,API在上層完成以下幾件事:

  ● 編程更加省力,提高城程序速度和代碼質量

  ● 非關聯的API提高互操作性

  ● 節省學習使用新API成本

  ● 節省設計新API的時間

  ● 鼓勵、促進軟件重用

        具體來說,有6個集合接口,最基本的是Collection接口,由三個接口Set、List、SortedSet繼承,另外兩個接口是Map、SortedMap,這兩個接口不繼承Collection,表示映射而不是真正的集合。

1.2 什麼是Iterator?

  一些集合類提供了內容遍歷的功能,通過java.util.Iterator接口。這些接口允許遍歷對象的集合。依次操作每個元素對象。當使用 Iterators時,在獲得Iterator的時候包含一個集合快照。通常在遍歷一個Iterator的時候不建議修改集合本省。

  • Iterator:只能正向遍歷集合,適用於獲取移除元素。
  • ListIerator:繼承Iterator,可以雙向列表的遍歷,同樣支持元素的修改。

2.集合和數組的區別

è¿éåå¾çæè¿°

3.Collection集合的方法

è¿éåå¾çæè¿°

4.常用集合的分類(總結)

Java集合框架主要包括兩種類型的容器,一種是集合(Collection),另一種是圖(Map)。

Collection 接口的接口 對象的集合(單列集合) 
├——-List 接口:元素按進入先後有序保存,可重複 
│—————-├ LinkedList 接口實現類, 底層數據結構是鏈表, 插入刪除, 沒有同步, 線程不安全 
│—————-├ ArrayList 接口實現類, 底層數據結構是數組, 隨機訪問, 沒有同步, 線程不安全 
│—————-└ Vector 接口實現類 底層數據結構是數組, 同步, 線程安全 
│ ———————-└ Stack 是Vector類的實現類 
└——-Set 接口: 僅接收一次,不可重複,並做內部排序 
├—————-└HashSet 使用底層使用hash表(數組)存儲元素 (無序)
│————————└ LinkedHashSet 鏈表維護元素的插入次序 (FIFO,由鏈表保證元素有序,哈希表保證元素唯一)
└ —————-TreeSet 底層實現爲二叉樹(紅黑樹),元素排好序(根據比較的返回值是否是0來決定元素是否唯一)

Map 接口 鍵值對的集合 (雙列集合) 
├———Hashtable 接口實現類, 同步, 線程安全 
├———HashMap 接口實現類 ,沒有同步, 線程不安全- 
│—————–├ LinkedHashMap 雙向鏈表和哈希表實現 
│—————–└ WeakHashMap 
├ ——–TreeMap 紅黑樹對所有的key進行排序 (有序)
└———IdentifyHashMap

注意:Hashtable不允許null值,HashMap允許null值(key和value都允許)

4.1 List和Set集合詳解

4.1.1 list和set的區別

è¿éåå¾çæè¿°

4.1.2 List
(1)ArrayList:底層數據結構是數組,查詢快,增刪慢,線程不安全,效率高,可以存儲重複元素 
(2)LinkedList 底層數據結構是鏈表,查詢慢,增刪快,線程不安全,效率高,可以存儲重複元素 
(3)Vector:底層數據結構是數組,查詢快,增刪慢,線程安全,效率低,可以存儲重複元素 


è¿éåå¾çæè¿°

  • ArrayList與LinkedList的區別和適用場景

Arraylist: 
優點:ArrayList是實現了基於動態數組的數據結構,因爲地址連續,一旦數據存儲好了,查詢操作效率會比較高(在內存裏是連着放的)。 
缺點:因爲地址連續, ArrayList要移動數據,所以插入和刪除操作效率比較低。

LinkedList: 
優點:LinkedList基於鏈表的數據結構,地址是任意的,所以在開闢內存空間的時候不需要等一個連續的地址,對於新增和刪除操作add和remove,LinedList比較佔優勢。LinkedList 適用於要頭尾操作或插入指定位置的場景 
缺點:因爲LinkedList要移動指針,所以查詢操作性能比較低。 

4.1.3 set

  1. HashSet:底層數據結構採用哈希表實現,元素無序且唯一,線程不安全,效率高,可以存儲null元素,但只能放入一個null,元素的唯一性是靠所存儲元素類型是否重寫hashCode()和equals()方法來保證的,如果沒有重寫這兩個方法,則無法保證元素的唯一性。
  2. LinkedHashSet:底層數據結構採用鏈表和哈希表共同實現,鏈表保證了元素的順序與存儲順序一致,哈希表保證了元素的唯一性。線程不安全,效率高。 
  3. TreeSet:底層數據結構採用二叉樹來實現,元素唯一且已經排好序,不允許放入null值 ;唯一性同樣需要重寫hashCode和equals()方法,二叉樹結構保證了元素的有序性。根據構造方法不同,分爲自然排序(無參構造)和比較器排序(有參構造),自然排序要求元素必須實現Compareable接口,並重寫裏面的compareTo()方法,元素通過比較返回的int值來判斷排序序列,返回0說明兩個對象相同,不需要存儲;比較器排需要在TreeSet初始化是時候傳入一個實現Comparator接口的比較器對象,或者採用匿名內部類的方式new一個Comparator對象,重寫裏面的compare()方法; 
  4. 適用場景分析:HashSet是基於Hash算法實現的,其性能通常都優於TreeSet。爲快速查找而設計的Set,我們通常都應該使用HashSet,在我們需要排序的功能時,我們才使用TreeSet。 

4.2 Map詳解

Map用於保存具有映射關係的數據,Map裏保存着兩組數據:key和value,它們都可以使任何引用類型的數據,但key不能重複。所以通過指定的key就可以取出對應的value。而HashMap是用哈希算法實現Map的具體實現類,別搞混了。

1 HashMap

  • HashMap是基於哈希表的Map接口的非同步實現,繼承自AbstractMap,AbstractMap是部分實現Map接口的抽象類。在平時的開發中,HashMap的使用還是比較多的。我們知道ArrayList主要是用數組來存儲元素的,LinkedList是用鏈表來存儲的,那麼HashMap的實現原理是什麼呢?先看下面這張圖:
  • 在之前的版本中,HashMap採用數組+鏈表實現,即使用鏈表處理衝突,同一hash值的鏈表都存儲在一個鏈表裏。但是當鏈表中的元素較多,即hash值相等的元素較多時,通過key值依次查找的效率較低。而JDK1.8中,HashMap採用數組+鏈表+紅黑樹實現,當鏈表長度超過閾值(8)時,將鏈表轉換爲紅黑樹,這樣大大減少了查找時間。
  • HashMap數據結構圖:

  • 在HashMap中要找到某個元素,需要根據key的hash值來求得對應數組中的位置。對於任意給定的對象,只要它的hashCode()返回值相同,那麼程序調用hash(int h)方法所計算得到的hash碼值總是相同的。我們首先想到的就是把hash值對數組長度取模運算,這樣一來,元素的分佈相對來說是比較均勻的。但是,“模”運算的消耗還是比較大的,在HashMap中,(n - 1) & hash用於計算對象應該保存在table數組的哪個索引處。HashMap底層數組的長度總是2的n次方,當數組長度爲2的n次冪的時候,(n - 1) & hash 算得的index相同的機率較小,數據在數組上分佈就比較均勻,也就是說碰撞的機率小,相對的,查詢的時候就不用遍歷某個位置上的鏈表,這樣查詢效率也就較高了。

  • 關於HashMap有一篇博客講的很細,可以去參考:https://angela.blog.csdn.net/article/details/104889549#comments

2.LinkedHashMap

LinkedHashMap繼承自HashMap,它主要是用鏈表實現來擴展HashMap類,HashMap中條目是沒有順序的,但是在LinkedHashMap中元素既可以按照它們插入圖的順序排序,也可以按它們最後一次被訪問的順序排序。

3.TreeMap

TreeMap基於紅黑樹數據結構的實現,鍵值可以使用Comparable或Comparator接口來排序。TreeMap繼承自AbstractMap,同時實現了接口NavigableMap,而接口NavigableMap則繼承自SortedMap。SortedMap是Map的子接口,使用它可以確保圖中的條目是排好序的。

在實際使用中,如果更新圖時不需要保持圖中元素的順序,就使用HashMap,如果需要保持圖中元素的插入順序或者訪問順序,就使用LinkedHashMap,如果需要使圖按照鍵值排序,就使用TreeMap。
 

HashMap和HashTable的比較: 

è¿éåå¾çæè¿°

小結: 

  1. HashMap和HashTable:HashMap去掉了HashTable的contains方法,但是加上了containsValue()和containsKey()方法。HashTable同步的,而HashMap是非同步的,效率上比HashTable要高。HashMap允許空鍵值,而HashTable不允許。
  2. HashMap:適用於Map中插入、刪除和定位元素。 
  3. Treemap:適用於按自然順序或自定義順序遍歷鍵(key)。
  4. LinkedList、ArrayList、HashSet是非線程安全的,Vector是線程安全的; 
  5. HashMap,TreeMap是非線程安全的,HashTable是線程安全的; 
  6. StringBuilder是非線程安全的,StringBuffer是線程安全的。
  7. HashMap可以通過Map m = Collections.synchronizedMap(hashMap)來達到同步的效果。

 

本文參考了以下博客:

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章