Java集合源碼總覽(jdk1.8)

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實現的棧

List

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,線程安全

Map

3、Set

Set對應於數學概念上的集合,裏面的元素是不可重複的,通常使用Map或者List來實現。

Set的實現主要有HashSet、LinkedHashSet、TreeSet、CopyOnWriteArraySet、ConcurrentSkipSet。

HashSet通過HashMap的key實現
TreeSet底層是紅黑樹
LinkedHashSet繼承自HashSet,通過LinkedHashMap實現

Set

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