Java集合源碼總覽(jdk1.8)
文章目錄
一、集合概述
①、集合是用於存放對象的容器,通常與泛型結合使用。
必須是對象類型,泛型類型必須是對象類型,數據如果是基本類型,會被自動轉換成封裝類。
如int裝箱成Integer。
②、集合存放的是多個對象的引用,對象本身還是放在堆內存中。
③、集合可以存放不同類型數據,是對各種數據結構和算法的封裝。
二、常用集合容器
Java常用集合容器有List,Set,Map,這也是對應接口的名字。
List和Set接口又繼承自Collection接口,Map接口獨樹一幟。
Collection接口又繼承了Iterable接口,可以獲得Iterator迭代器。
- Set下有HashSet,LinkedHashSet,TreeSet等
- List下有ArrayList,Vector,LinkedList、Stack等
- Map下有Hashtable,LinkedHashMap,HashMap,TreeMap等
這些是最常用的容器。
Set是一個無序,不可重複的集合
List 是有序,可以重複的集合。
Map由鍵值對組成,是一種映射關係。
通過List、Set、Map已經可以實現大部分的數據結構。
三、上層結構
1、Iterator迭代器
Iterable是Collection接口的父接口,該接口中有一個重要方法:
Iterator<T> iterator();
通過該方法可以Set和List可以獲得迭代器,進行遍歷數據。
Map沒有繼承Collection接口,但是其實現類中定義了相應的迭代器。
Iterator接口中有兩個重要方法。
boolean hasNext();//容器是否還有元素
E next();//獲取元素
2、ListIterator迭代器
List中還有一種迭代器,ListIterator。
public ListIterator<E> listIterator(int var1)
List是有序的結構,有時需要向前遍歷,所以ListIterator提供了一些向前的方法。
public interface ListIterator<E> extends Iterator<E> {
boolean hasNext();
E next();
boolean hasPrevious();//該位置前方是否還有元素
E previous();//獲取前一個元素
int nextIndex();//下一個元素的索引
int previousIndex();//前一個元素的所有
void remove();//將元素從迭代器中刪除
void set(E e);//修改
void add(E e);//添加
}
3、Collection集合接口
Collection是List和Set的高層父接口。
public interface Collection<E> extends Iterable<E> {
int size();
boolean isEmpty();
boolean contains(Object o);
Iterator<E> iterator();
Object[] toArray();//轉換爲數組
<T> T[] toArray(T[] a);//轉換爲指定類型數組
boolean add(E e);
boolean remove(Object o);
boolean containsAll(Collection<?> c);//是否爲子集
boolean addAll(Collection<? extends E> c);//將c加入集合中,求並集
boolean removeAll(Collection<?> c);//求差集
boolean retainAll(Collection<?> c);//求交集
void clear();//清空
}
還有個子類AbstractCollection,實現了部分方法。
該類又被相應的abstractSet和AbstractList繼承。
4、Queue、Deque接口
隊列接口和雙端隊列接口。
Queue繼承自Collection.
Deque繼承Queue.
四、重要接口
1、List
List中的元素是有序的、可重複的,主要實現方式有動態數組和鏈表。
List的實現主要有ArrayList、LinkedList,另外還有兩個類Vector和Stack,這兩個類的功能可以被其他類替代掉,CopyOnWriteArrayList是併發安全的ArrayList,屬於併發包下。
ArrayList | 底層是數組、查詢快、增刪慢 |
LinkedList | 底層是鏈表,查詢慢、增刪塊 |
CopyOnWriteArrayList | 底層是數組、和ArrayList相似,線程安全(加鎖)、性能略低 |
Vector | 底層是數組、和ArrayList相似,線程安全(synchronized)、性能略低 |
Stack | 基於Vector實現的棧 |
2、Map
Map是一種(key/value)的映射結構,其它語言裏可能稱作字典(Dictionary),Map中的元素是一個key只能對應一個value,不能存在重複的key。
Map的實現主要有HashMap、LinkedHashMap、WeakHashMap、TreeMap、ConcurrentHashMap、ConcurrentSkipListMap,另外還有兩個比較古老的Map實現HashTable和Properties。
HashMap | 底層是數組+鏈表+紅黑樹,線程不安全 |
TreeMap | 底層是紅黑樹,通過Key將元素排序 |
HashTable | 基本和HashMap一樣,線程安全(synchronized),基本每個方法都加鎖,性能低,基本被ConcurrentHashMap替代 |
LinkedHashMap | 底層和HashMap一樣,只不過鏈表是雙向鏈表,除了可以按照插入順序存儲外,還可以將訪問順序存儲元素,性能略低於hashMap(維護雙向鏈表) |
ConcurrentHashMap | 併發包下的HashMap,線程安全 |
3、Set
Set對應於數學概念上的集合,裏面的元素是不可重複的,通常使用Map或者List來實現。
Set的實現主要有HashSet、LinkedHashSet、TreeSet、CopyOnWriteArraySet、ConcurrentSkipSet。
HashSet | 通過HashMap的key實現 |
TreeSet | 底層是紅黑樹 |
LinkedHashSet | 繼承自HashSet,通過LinkedHashMap實現 |