1. 程式人生 > >java之集合概述

java之集合概述

異常 並不是 就是 htable 保存 res ack 以及 num

整體類圖

技術分享圖片

Java集合是java提供的工具包,包含了常用的數據結構:集合、鏈表、隊列、棧、數組、映射等。Java集合工具包位置是java.util.*
Java集合主要可以劃分為4個部分:List列表、Set集合、Map映射、工具類(Iterator叠代器、Enumeration枚舉類、Arrays和Collections)。

接口

上圖中看到 主要的接口類為:Collection 和 Map。

繼承Collection的接口主要有三大類:List、Set、Queue;實現Collection接口的AbstractCollection

繼承Map接口的主要有:SortedMap ,實現Map的有AbstractMap 以及HashTable

list

List是一個有序的隊列,每一個元素都有它的索引。第一個元素的索引值是0。List的實現類有LinkedList, ArrayList, Vector, Stack。

  • LinkedList:底層數據結構為雙向鏈接隊列,可以被當作棧、隊列或雙端隊列來使用。非線程安全
  • ArrayList:基於動態數組的數據結構。因此對於隨機訪問get和set,ArrayList要優於LinkedList,因為LinkedList要移動指針;理論上當要在ArrayList非尾部index處插入數據,index之後的所有元素,會被移動會導致插入效率變低。非線程安全
  • Vector :基於動態數組的數據結構。是線程安全的(相對線程安全)。主要用在事先不知道數組的大小,或者只是需要一個可以改變大小的數組的情況。默認數組大小為 10,如果未指定擴容大小,擴容時按現在數據大小的兩倍擴容。
  • stack :是Vector的一個子類,它實現了一個標準的後進先出的棧。

set

Set是一個不允許有重復元素的集合。 Set的實現類有HastSet和TreeSet。HashSet依賴於HashMap,它實際上是通過HashMap實現的;TreeSet依賴於TreeMap,它實際上是通過TreeMap實現的。

  • HastSet:通過HashMap實現。 HashSet 中的所有元素都是保存在 HashMap 的 key 中,value 則是使用的 PRESENT 對象,該對象為 static final Object。默認的初始容量為16,負載因子為0.75.
  • TreeSet:是基於 TreeMap 實現的,TreeMap是一個有序的二叉樹,那麽同理TreeSet同樣也是一個有序的,它的作用是提供有序的 Set 集合。

HashMap

基於哈希表的 Map 接口的實現,以 key-value 的形式存在。初始化時,最為重要的兩個參數為:初始容量和負載因子

  • 初始容量:表示哈希表中桶的數量,初始容量是創建哈希表時的容量

  • 加載因子:是哈希表在其容量自動增加之前可以達到多滿的一種尺度,它衡量的是一個散列表的空間的使用程度,負載因子越大表示散列表的裝填程度越高,反之愈小。對於使用鏈表法的散列表來說,查找一個元素的平均時間是O(1+a),因此如果負載因子越大,對空間的利用更充分,然而後果是查找效率的降低;如果負載因子太小,那麽散列表的數據將過於稀疏,對空間造成嚴重浪費。系統默認負載因子為 0.75,一般情況下我們是無需修改的。

  • Put過程:首先判斷 key 是否為 null,若為 null,則直接調用 putForNullKey 方法。若不為空則先計算 key 的 hash 值,然後根據 hash 值搜索在 table 數組中的索引位置,如果 table 數組在該位置處有元素,則通過比較是否存在相同的 key,若存在則覆蓋原來 key 的 value,否則將該元素保存在鏈頭(最先保存的元素放在鏈尾)。若 table 在該處沒有元素,則直接保存。

  • Get過程:若為null,直接取第一個;若不為空則先計算 key 的 hash 值,然後根據 hash 值搜索在 table 數組中的索引位置。然後返回該 key 對應的 value 即可。

  • HashMap 的底層數組長度總是 2 的 n 次方,在構造函數中存在:capacity <<= 1;這樣做總是能夠保證 HashMap 的底層數組長度為 2 的 n 次方。當 length 為 2 的 n 次方時,h&(length – 1) 就相當於對 length 取模,而且速度比直接取模快得多,這是 HashMap 在速度上的一個優化。

TreeMap

TreeMap 實現是紅黑樹算法的實現。紅黑樹是一顆自平衡的排序二叉樹,即根節點大於左子樹小於右子樹。所以TreeMap是有序的Map結構

WeakHashMap

WeakHashMap的存儲結構等與HashMap的結構幾乎一樣,不同指出是其引用是弱引用。所謂弱引用是指,java垃圾回收器,在檢查到該引用是弱引用的時候,不管內存是否夠用都會對此引用進行垃圾回收。

HashTable

實現Map接口,繼承了Dictionary。HashTable采用”拉鏈法”實現哈希表,它定義了幾個重要的參數:table、count、threshold、loadFactor、modCount。

table:為一個Entry[]數組類型,Entry代表了“拉鏈”的節點,每一個Entry代表了一個鍵值對,哈希表的”key-value鍵值對”都是存儲在Entry數組中的。

count:HashTable的大小,註意這個大小並不是HashTable的容器大小,而是他所包含Entry鍵值對的數量。

threshold:Hashtable的閾值,用於判斷是否需要調整Hashtable的容量。threshold的值=”容量*加載因子”。

loadFactor:加載因子。

modCount:用來實現“fail-fast”機制的(也就是快速失敗)。所謂快速失敗就是在並發集合中,其進行叠代操作時,若有其他線程對其進行結構性的修改,這時叠代器會立馬感知到,並且立即拋出ConcurrentModificationException異常,而不是等到叠代完成之後才告訴你(你已經出錯了)。

HashTable與HashMap的區別

第一: 我們從他們的定義就可以看出他們的不同,HashTable基於Dictionary類,而HashMap是基於AbstractMap。Dictionary是什麽?它是任何可將鍵映射到相應值的類的抽象父類,而AbstractMap是基於Map接口的骨幹實現,它以最大限度地減少實現此接口所需的工作。
第二: HashMap可以允許存在一個為null的key和任意個為null的value,但是HashTable中的key和value都不允許為null。
第三: Hashtable的方法是同步的,而HashMap的方法不是。

java之集合概述