Java集合类复习
Java集合類復習
接口關系
Collection是集合set,list,Queue的基本接口。
Map:是映射表的基礎接口。
Iterator:迭代器接口
List接口
List 是有序的 Collection。List 一共三個實現類: ArrayList、Vector 和 LinkedList。List定義了若干線性結構數據的操作方法。
ArrayList(動態數組)
ArrayList 是最常用的 List 實現類,內部是通過數組實現的,它允許對元素進行快速隨機訪問。
ArrayList只能裝引用型對象。并且 ArrayList線程不安全 。
當數組大小不滿足時需要增加存儲能力,就要將已經有數組的數據復制到新的存儲空間中。 當從 ArrayList 的中間位置插入或者刪除元素時,需要對數組進行復制、移動、代價比較高。因此,它適合隨機查找和遍歷,不適合插入和刪除。
Vector(數組,線程安全)
Vector 與 ArrayList 一樣,也是通過數組實現的,不同的是它支持線程的同步。
Vector是使用synchronized實現線程安全的 ,但實現同步需要很高的花費,因此,訪問它比訪問 ArrayList 慢。
LinkList(鏈表)
LinkList是線程不安全的。
LinkedList 是用鏈表結構存儲數據的 ,很適合數據的動態插入和刪除,隨機訪問和遍歷速度比較慢。并且它格外實現了List接口中沒定義的方法,對鏈表的頭元素和未元素進行操作。
Set接口
Set 是一個無序的集合類接口,注重獨一無二的性質,值不能重復。
Set根據hashCode 值判斷對象是否相等,hashCode 值是依據對象的內存地址計算出的。
HashSet(Hash 表)
HashSet 存儲元素的順序并不是按照存入時的順序 ,而是按照哈希值來存的所以取數據也是按照哈希值取得。 HashSet 首先判斷兩個元素的哈希值,如果哈希值一樣,接著會比較equals 方法 如果 equls 結果為 true ,HashSet 就視為同一個元素。這樣主要是避免哈希沖突,所以還會使用equals 方法。
哈希值相同 equals 為 false 的元素是在同樣的哈希值下順延,就像哈希桶一樣。HashSet 通過 hashCode 值來確定元素在內存中的位置。 一個 hashCode 位置上可以存放多個元素 。
TreeSet(紅黑樹)
TreeSet是使用二叉樹的原理對新 add()的對象按照指定的順序排序,TreeSet底層存儲是使用紅黑樹實現的 。每增加一個對象都會進行排序,將對象插入的二叉樹指定的位置。
自定義類的對象必須實現 Comparable 接口,并且覆寫相應的 compareTo()函數,才可以正常使用。
LinkedHashSet
LinkedHashSet是HashSet+LinkedHashMap的組合體。
LinkedHashSet 底層使用 LinkedHashMap 來保存所有元素,它繼承與 HashSet,并且其所有的方法操作上又與 HashSet 相同。
HashMap(數組+鏈表,紅黑樹)
HashMap根據鍵的 hashCode 值存儲數據,HashMap 最多只允許一條記錄的鍵為 null。HashMap 非線程安全, 可以用 Collections 的 synchronizedMap 方法使HashMap 具有線程安全的能力。
- HashMap (JDK1.7):底層實現是數組+鏈表,HashMap 里面是一個數組,然后數組中每個元素是一個單向鏈表。并且鏈表元素是Entry 的實例。Entry 包含四個屬性:key, value, hash 值和用于單向鏈表的 next。
- HashMap (JDK1.8):底層實現是數組+鏈表+紅黑樹,當鏈表中的元素超過了 8 個以后,會將鏈表轉換為紅黑樹。
HashMap構造函數的參數解析:
- capacity:當前數組容量,始終保持 2^n,可以擴容。當數組的使用值到達擴容的閾值時進行2倍擴容。
- loadFactor:負載因子,默認為 0.75
- threshold:擴容的閾值
結構圖:
參考博文:https://www.cnblogs.com/myseries/p/10876843.html
ConcurrentHashMap(線程安全)
ConcurrentHashMap的 Segment段 。ConcurrentHashMap和HashMap相似,ConcurrentHashMap 由一個個 Segment 組成。每一個Segment是一組數組,我們姑且叫它 Segment數組。 ConcurrentHashMap是線程安全的 ,內部使用的是ReentrantLock 來進行加鎖。每次需要加鎖的操作鎖住的是一個 segment,這樣只要保證每個 Segment 是線程安全的。
- JDK1.7 下的ConcurrentHashMap結構:底層實現是 Segment數組+鏈表 , 上鎖的對象是Segment,類似于分段鎖。通過ReentrantLock 來進行加鎖來實現線程安全。
- JDK1.8 下的ConcurrentHashMap結構:底層實現是 Segment數組+鏈表+紅黑樹 ,跟HashMap類似。但鏈表長度大于某個閥值就變紅黑樹。
ConcurrentHashMap相關參數解析:
- concurrencyLevel:并行級別(Segment數組個數),默認是 16,Segment數組不可擴容 。
結構圖:
HashTable(線程安全)
映射的常用功能與 HashMap 類似,可以看作是線程安全版的HashMap,不同的是它承自 Dictionary 類。 HashTable是線程安全的 ,并發性上不如ConcurrentHashMap,因為HashTable沒有像ConcurrentHashMap一樣的分段鎖,同意時間只能有一個線程能寫Hashtable。Hashtable一般不用,我們一般使用HashMap或者ConcurrentHashMap。
TreeMap(紅黑)
TreeMap的底層使用了紅黑樹來實現 ,像TreeMap對象中放入一個key-value 鍵值對時,就會生成一個Entry對象。
TreeMap 實現 SortedMap 接口,能夠把它保存的記錄根據鍵排序,在使用 TreeMap 時,key 必須實現 Comparable 接口或者在構造 TreeMap 傳入自定義的Comparator。跟Treeset相似,也是通過對象的Comparable的接口方法來進行排序的,只不過 TreeMap使用key的Comparable 接口方法對比,而Treeset是直接使用對象的Comparable 接口方法對比 。
LinkedHashMap
LinkedHashMap 是 HashMap 的一個子類,保存了記錄的插入順序。
排序的,只不過 TreeMap使用key的Comparable 接口方法對比,而Treeset是直接使用對象的Comparable 接口方法對比 。
LinkedHashMap
LinkedHashMap 是 HashMap 的一個子類,保存了記錄的插入順序。
總結
- 上一篇: 大年初一有什么风俗 吃斋
- 下一篇: 字节跳动香港新办公室已启用 每月月租或超