Java中的集合概述
1. 概述
Java中的集合主要有兩種:java
- Collection
- Map
集合的本質是用來存儲批量的對象。數組
2. Collection接口
Collection 類是一個接口類,定義了集合中最基本的經常使用方法。安全
繼承了Collection的接口類有:數據結構
實現了Collection的抽象類有:多線程
AbstractCollection衍生了兩個子抽象類,分別是:併發
圖示以下:函數

咱們主要仍是關注下具體的實現類吧。線程
2.1 List
List接口有四個實現類3d
- LinkedList
- ArrayList
- Vector
- Stack(Vector的子類)
2.1.1 LinkedList
- 基於雙向鏈表實現
- 不支持任意性的訪問,便於插入和刪除,不便於遍歷
- 非線程安全(即支持多個線程併發讀取)
2.1.2 ArrayList
- 基於數組實現
- 初始容量是10,快要溢出時會進行動態擴容(1.5倍擴容)
- 支持任意性的訪問(根據索引)
- 非線程安全(即支持多個線程併發讀取)
2.1.3 Vector(基本不使用,被ArrayList取代)
- 基於數組實現
- 支持任意性的訪問(根據索引)
- 線程安全(同一時刻,只能有一個線程讀取Vector)
2.1.4 Stack
- 繼承於Vector
- 實現了數據結構中後進先出的堆棧
- 主要方法有:
- push()// 添加元素到棧頂
- pop()//刪除棧頂的元素
- peek() 獲取棧頂元素
- empty() 判斷是否爲空
2.2 Set
Set是元素不可重複(根據元素的hashCode()和equals()方法來判斷兩個元素是否相同)的集合,容許null的存在,但僅能存在一個(由於set的元素不能重複);不支持隨機訪問( 無序), 雖然Set中元素沒有順序,可是元素在set中的位置是由該元素的HashCode決定的,其具體位置實際上是固定的。對象
2.2.1 HashSet
- 元素不可重複
- 底層是HashMap,存儲的key是插入的元素,value是一個Object
- 非同步(線程不安全)
- 不保證插入順序和讀取順序一致
2.2.2 LinkedHashSet
- 繼承於HashSet
- 底層是LinkedHashMap,
- 有序(鏈表維護順序),
- 非同步(線程不安全)
2.2.3 TreeSet
- 有序
- 底層是TreeMap
- 非同步(線程不安全)
- 經過compare或者comparaeTo函數來判斷元素是否相等
3. Map接口
Map沒有繼承Collection,是多個鍵值對元素組成的集合,提供了鍵(key)到值(value)的映射,key不可重複。
3.1 HashMap
- 以哈希表的數據結構(數組+鏈表)實現,查找對象時經過哈希函數計算其位置,查詢效率高
- 內部定義有hash表數組,經過哈希函數將元素(鍵值對)的哈希地址,轉換爲hash表數組的索引(下標)
- 若是有兩個元素計算出來的索引值相同,則用鏈表的數據結構將兩個元素串起來,此時,兩個元素的hash值相同
- 線程不安全
- 繼承於AbstractMap,實現了Map、Cloneable、java.io.Serializable接口。
3.2 HashTable
- 線程安全版的HashMap,通常用於多線程中
- 鍵值都不容許爲null
- 繼承於Dictionary,實現了Map、Cloneable、java.io.Serializable接口
3.3 LinkedHashMap
- 繼承於HashMap
- 經過鏈表的數據結構( 雙鏈表 )來保證讀取順序和插入順序一致
- 非線程安全
3.4 TreeMap
- 有序
- 非線程安全
- 基於紅黑樹實現
- 每個key-value節點做爲紅黑樹的一個節點。TreeMap存儲時會進行排序
- 其中排序方式也是分爲兩種,一種是天然排序,一種是定製排序
- 天然排序: TreeMap中全部的key必須實現Comparable接口,而且全部的key都應該是同一個類的對象,不然會報ClassCastException異常。
- 定製排序: 定義TreeMap時,建立一個comparator對象,該對象對全部的treeMap中全部的key值進行排序,採用定製排序的時候不須要TreeMap中全部的key必須實現Comparable接口
- 判斷元素相等的依據: 兩個key經過compareTo()方法返回0,則認爲這兩個key相等。
3.5 WeakHashMap
- 繼承於AbstractMap
- 鍵和值均可以是null
- 鍵是」弱鍵「
- 線程不安全
- 數據結構是哈希表(還有單項鍊表)