JAVA容器全面總結

 

1      容器體系圖

簡圖:html

   

 

詳圖:
java

2      基礎

2.1      Iterator接口

迭代器。node

具備的能力:後向迭代、刪除。算法

 

 

2.2      Iterable接口

表示一個類具備迭代能力。數組

提供能力:經過iterator()方法,返回iterator。安全

 

2.3      Collection接口

集合接口數據結構

繼承Iterable,具備迭代能力app

新增接口:dom

       Size,isEmpty,contains,toArray,add,remove,以及批量操做,條件操做。ide

 

2.4      AbstractCollection抽象類

這不是接口了,是個抽象類,實現了Collection接口

實現了Collection種的大部分方法。

toArray,這個的實現是新new的一個數組,把元素一個個拷貝上去。

 

 

2.5      Collection的重要子接口

List、Set、Queue

3      工具類

3.1      Array類

這個類屬於java.lang.reflect包,因此能夠看出,用的是反射的方法。

而後,這是個final類,不能夠new,只是提供static方法。

The {@code Array} class provides static methods to dynamically create and access Java arrays.

提供靜態方法,建立和訪問java數組。

 

提供方法:

NewInstance, getLength,get,getXXX類型,set,setXXX類型,

 

3.2      Collections類

容器工具類

方法見:https://blog.csdn.net/u013256816/article/details/50924875

 

  1. 調用一個空List,Set,Map  //靜態成員變量
  2. addAll
  3. binarySearch  利用二分法在指定的集合中查找元素
  4. sort
  5. shuffle  //混排。混排算法所作的正好與sort相反:它打亂在一個List中可能有的任何排列的蹤影。
  6. reverse  //反轉
  7. synchronizedXXX //確保所封裝的集合線程安全(強同步)
  8. unmodifiableXXXX //確保所封裝的集合不能修改。

 

4      List

4.1      特徵

特徵:有順序能夠重複,有順序因此操做時能夠在方法中加入索引參數。

一樣繼承於Collection的Set則不可排序。

雖然咱們通常都用iterator單向遍歷list,但List是都是能夠用ListIterator迭代器雙向迭代的。

 

4.2      ListIterator

繼承自Iterator

增長功能:

前向迭代類的:previous,

索引類:nextIndex,previousIndex

操做類:增長、修改

4.3      List接口

繼承自Collection

增長功能:

獲取對應的迭代器:listIterator

基於索引/可排序的功能:sort,indexOf,lastIndexOf,subList

 

4.4      AbstractList抽象類

繼承自AbstractCollection

實現List接口

 

實現了迭代器。

4.4.1        Itr內部類

AbstractList可返回的迭代器。

實現了Iterator,經過int cursor記錄迭代位置。

4.4.2        ListItr內部類

AbstractList可返回的迭代器。

繼承Itr

增長功能:前向迭代、查看序號、增長、修改。

4.4.3        SubList內部類

AbstractList的內部類,用於計算sublist

算出的sublist的元素與原list共用,只是在使用的時候加了個offset。

 

4.5      AbstractList的三個重要子類

ArrayList 數組實現的

Vector 也是數組實現的,線程安全的

LinkedList 鏈表實現的

 

4.6      ArrayList類

繼承自AbstractList

 

特徵:用數組實現。

 

實現:List、RandomAccess、Cloneable、Serializable

 

數據存放:transient Object[] elementData;(transient不序列化)

 

增長能力:

       自動擴容

 

覆蓋了AbstractList的三個內部類。是用數組的方式實現的迭代。

 

4.7      Vector類

基本同ArrayList

數據存放:protected Object[] elementData;  --  這個沒有用transient

新特性:線程同步,大多數方法都用synchronized修飾了。

 

4.8      AbstractSequentialList抽象類

繼承自AbstractList

實現了一些接口,實現都是依賴於迭代器,但迭代器仍是抽象的。

 

4.9      Queue接口

繼承自Collection

特徵:先進先出隊列

提供接口:offer,poll,remove,element,peek

4.10   Deque接口

繼承自Queue

特徵:雙向列表

提供接口:在Queue的基礎上,添加上從頭增刪,從尾增刪的接口。xxxFirst,xxxxLast.

 

4.11   LinkedList

繼承自AbstractSequentialList
實現:List、Deque、Cloneable、Serializable
能夠看到,跟ArrayList的區別是實現了Deque,沒實現RandomAccess

 

特徵:雙向鏈表實現的。

 

新增接口:封裝了Depue的一些雙向列表的一些接口,如 push,pop等

 

覆蓋了AbstractList的內部類ListItr,直接繼承自ListIterator。用列表的方式實現迭代。

 

用途:堆棧、隊列、雙向列表。

 

4.12   Stack類

繼承自Vector

封裝Vector方法實現棧接口:push pop peek

5      Set

5.1      特徵

無順序不能夠重複

無序於是不能經過索引操做對象

 

5.2      Set接口

繼承自Collection

沒提供新的接口,只是聲明這是一個Set類型的Collection

 

5.3      AbstractSet抽象類

繼承自AbstractCollection

實現Set接口

 

5.4      HashSet類

繼承自AbstractSet

實現Set, Cloneable, Serializable

 

數據結構:private transient HashMap<E,Object> map;

此處可見,HashSet是用HashMap實現的,只是用key存放實際對象,用Vaule存放了一個空的常量。private static final Object PRESENT = new Object();

Iterator是返回key的Iterator。

 

5.5      LinkedHashSet類

繼承自HashSet

實現Set, Cloneable, Serializable

 

跟HashSet的區別是他是用LinkedHashMap來存放數據的,也就是說,區別就是HashMap和LinkedHashMap的區別。

 

 

5.6      SortedSet接口

繼承自Set接口

添加了順序功能接口:

       位置:First,last

子Set:subSet,headSet,tailSet

須要一個比較運算。

 

5.7      NavigableSet接口

繼承自SortedSet

 

添加了導航功能(返回和給定元素有響應關係的元素):

       Lower,floor,ceiling,higher,pollFirst,pollLast

 

5.8      TreeSet類

繼承自AbstractSet

實現NavigableSet,Cloneable,Serializable

 

數據對象:private transient NavigableMap<E,Object> m;

 

具備排序功能

功能仍是依賴於對應的map類。

 

6      Map

6.1      Map體系圖

 

 

6.2      特徵

 

6.3      Map接口

並無繼承自Collection,也沒有聲明iterable,僅僅是聲明瞭一些和Collection相似的方法。

基礎方法:Size、isEmpty…

Key相關方法:containsKey、containsValue…

元素操做:get、put、remove…

Collection<V> values();

Set<Map.Entry<K, V>> entrySet();

 

6.4      AbstractMap抽象類

繼承自Map

 

 

6.5      HashMap類

    extends AbstractMap<K,V>

implements Map<K,V>, Cloneable, Serializable

 

存數據的地方:transient Node<K,V>[] table;  //這裏數組的每一個Node表明一個桶。

       static class Node<K,V> implements Map.Entry<K,V>//node中存放了next node的地址。

實際數據結構以下圖:

 

 

 

HashMap 永遠都是在鏈表的表頭添加新元素。

 

6.5.1        自動擴容

隨着HashMap中元素的數量愈來愈多,發生碰撞的機率將愈來愈大,所產生的子鏈長度就會愈來愈長,這樣勢必會影響HashMap的存取速度。爲了保證HashMap的效率,系統必需要在某個臨界點進行擴容處理,該臨界點就是HashMap中元素的數量在數值上等於threshold(table數組長度*加載因子)。可是,不得不說,擴容是一個很是耗時的過程,由於它須要從新計算這些元素在新table數組中的位置並進行復制處理。因此,若是咱們可以提早預知HashMap 中元素的個數,那麼在構造HashMap時預設元素的個數可以有效的提升HashMap的性能。

 

6.5.2        HashMap 的底層數組長度爲什麼老是2的n次方?

對hash取餘時,對2^n-1作與運算便可。

這樣能夠保證最大的利用率和最小的碰撞機會。

6.5.3        Fail-Fast 機制

咱們知道 java.util.HashMap 不是線程安全的,所以若是在使用迭代器的過程當中有其餘線程修改了 map,那麼將拋出 ConcurrentModificationException,這就是所謂 fail-fast 策略。

在迭代過程當中,判斷 modCount 跟 expectedModCount 是否相等,若是不相等就表示已經有其餘線程修改了 Map:

注意到 modCount 聲明爲 volatile,保證線程之間修改的可見性。

 

 

6.6      LinkedHashMap類

public class LinkedHashMap<K,V>
    extends HashMap<K,V>
    implements Map<K,V>

 

LinkedHashMap繼承了HashMap的所用特性,而且還經過額外維護一個雙向鏈表保持了有序性

對於每次put進來Entry,除了將其保存到哈希表中對應的位置上以外,還會將其插入到雙向鏈表的尾部。

    static class Entry<K,V> extends HashMap.Node<K,V> {

        Entry<K,V> before, after; //節點在原先的基礎上,加上了雙向列表的屬性。

}

 

 

 

LinkedHashMap重寫了HashMap 的迭代器,它使用其維護的雙向鏈表進行迭代輸出。

 

6.7      Hashtable類

public class Hashtable<K,V>
    extends Dictionary<K,V>
    implements Map<K,V>, Cloneable, java.io.Serializable {

Dictionary類是任何可將鍵映射到相應值的類(如 Hashtable)的抽象父類,每一個鍵和值都是對象。但Dictionary 這個類過期了,新的實現類應該實現Map接口。

 

HashTable和HashMap幾乎功能是相同的,差異:

一、  HashTable是同步的。

二、  HashTable不容許Null作key。

 

6.8      ConcurrentMap接口

沒幹啥,只是聲明爲同步

6.9      ConcurrentHashMap類

public class ConcurrentHashMap<K,V> extends AbstractMap<K,V>
    implements ConcurrentMap<K,V>, Serializable {

 

使用樂觀鎖(asTabAt)進行同步控制的。
比HashTable(使用synchronized)性能要高的多。
 
 

6.10   SortedMap接口

public interface SortedMap<K,V> extends Map<K,V>

比較、排序

 

6.11   NavigableMap接口

public interface NavigableMap<K,V> extends SortedMap<K,V> {

添加了導航功能(返回和給定元素有響應關係的元素):

       Lower,floor,ceiling,higher,pollFirst,pollLast

 

6.12   TreeMap類

public class TreeMap<K,V>
    extends AbstractMap<K,V>
    implements NavigableMap<K,V>, Cloneable, java.io.Serializable

TreeMap實現了紅黑樹的結構,造成了一顆二叉樹。

 

特徵:

一、  用紅黑樹實現了插入時的天然排序

二、  紅黑樹的好處:平衡二叉樹,查詢效率高。

 

7      Java1.8新特性

7.1      Foreach

 

7.2      Spliterator

 

 

 

8      參考

java容器類總結

http://www.javashuo.com/article/p-pxpyyesg-cw.html

 

Map 綜述(一):徹頭徹尾理解 HashMap

http://www.javashuo.com/article/p-uizorzvn-a.html

Map 綜述(二):徹頭徹尾理解 LinkedHashMap

http://www.javashuo.com/article/p-qtvrednt-b.html

 

Hashtable 的實現原理

http://wiki.jikexueyuan.com/project/java-collection/hashtable.html

 

Java集合--TreeMap徹底解析

https://www.jianshu.com/p/2dcff3634326

相關文章
相關標籤/搜索