簡圖:html
詳圖:
java
迭代器。node
具備的能力:後向迭代、刪除。算法
表示一個類具備迭代能力。數組
提供能力:經過iterator()方法,返回iterator。安全
集合接口數據結構
繼承Iterable,具備迭代能力app
新增接口:dom
Size,isEmpty,contains,toArray,add,remove,以及批量操做,條件操做。ide
這不是接口了,是個抽象類,實現了Collection接口
實現了Collection種的大部分方法。
toArray,這個的實現是新new的一個數組,把元素一個個拷貝上去。
List、Set、Queue
這個類屬於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類型,
容器工具類
方法見:https://blog.csdn.net/u013256816/article/details/50924875
特徵:有順序能夠重複,有順序因此操做時能夠在方法中加入索引參數。
一樣繼承於Collection的Set則不可排序。
雖然咱們通常都用iterator單向遍歷list,但List是都是能夠用ListIterator迭代器雙向迭代的。
繼承自Iterator
增長功能:
前向迭代類的:previous,
索引類:nextIndex,previousIndex
操做類:增長、修改
繼承自Collection
增長功能:
獲取對應的迭代器:listIterator
基於索引/可排序的功能:sort,indexOf,lastIndexOf,subList
繼承自AbstractCollection
實現List接口
實現了迭代器。
AbstractList可返回的迭代器。
實現了Iterator,經過int cursor記錄迭代位置。
AbstractList可返回的迭代器。
繼承Itr
增長功能:前向迭代、查看序號、增長、修改。
AbstractList的內部類,用於計算sublist
算出的sublist的元素與原list共用,只是在使用的時候加了個offset。
ArrayList 數組實現的
Vector 也是數組實現的,線程安全的
LinkedList 鏈表實現的
繼承自AbstractList
特徵:用數組實現。
實現:List、RandomAccess、Cloneable、Serializable
數據存放:transient Object[] elementData;(transient不序列化)
增長能力:
自動擴容
覆蓋了AbstractList的三個內部類。是用數組的方式實現的迭代。
基本同ArrayList
數據存放:protected Object[] elementData; -- 這個沒有用transient
新特性:線程同步,大多數方法都用synchronized修飾了。
繼承自AbstractList
實現了一些接口,實現都是依賴於迭代器,但迭代器仍是抽象的。
繼承自Collection
特徵:先進先出隊列
提供接口:offer,poll,remove,element,peek
繼承自Queue
特徵:雙向列表
提供接口:在Queue的基礎上,添加上從頭增刪,從尾增刪的接口。xxxFirst,xxxxLast.
繼承自AbstractSequentialList
實現:List、Deque、Cloneable、Serializable
能夠看到,跟ArrayList的區別是實現了Deque,沒實現RandomAccess
特徵:雙向鏈表實現的。
新增接口:封裝了Depue的一些雙向列表的一些接口,如 push,pop等
覆蓋了AbstractList的內部類ListItr,直接繼承自ListIterator。用列表的方式實現迭代。
用途:堆棧、隊列、雙向列表。
繼承自Vector
封裝Vector方法實現棧接口:push pop peek
無順序不能夠重複
無序於是不能經過索引操做對象
繼承自Collection
沒提供新的接口,只是聲明這是一個Set類型的Collection
繼承自AbstractCollection
實現Set接口
繼承自AbstractSet
實現Set, Cloneable, Serializable
數據結構:private transient HashMap<E,Object> map;
此處可見,HashSet是用HashMap實現的,只是用key存放實際對象,用Vaule存放了一個空的常量。private static final Object PRESENT = new Object();
Iterator是返回key的Iterator。
繼承自HashSet
實現Set, Cloneable, Serializable
跟HashSet的區別是他是用LinkedHashMap來存放數據的,也就是說,區別就是HashMap和LinkedHashMap的區別。
繼承自Set接口
添加了順序功能接口:
位置:First,last
子Set:subSet,headSet,tailSet
須要一個比較運算。
繼承自SortedSet
添加了導航功能(返回和給定元素有響應關係的元素):
Lower,floor,ceiling,higher,pollFirst,pollLast
繼承自AbstractSet
實現NavigableSet,Cloneable,Serializable
數據對象:private transient NavigableMap<E,Object> m;
具備排序功能
功能仍是依賴於對應的map類。
並無繼承自Collection,也沒有聲明iterable,僅僅是聲明瞭一些和Collection相似的方法。
基礎方法:Size、isEmpty…
Key相關方法:containsKey、containsValue…
元素操做:get、put、remove…
Collection<V> values();
Set<Map.Entry<K, V>> entrySet();
繼承自Map
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 永遠都是在鏈表的表頭添加新元素。
隨着HashMap中元素的數量愈來愈多,發生碰撞的機率將愈來愈大,所產生的子鏈長度就會愈來愈長,這樣勢必會影響HashMap的存取速度。爲了保證HashMap的效率,系統必需要在某個臨界點進行擴容處理,該臨界點就是HashMap中元素的數量在數值上等於threshold(table數組長度*加載因子)。可是,不得不說,擴容是一個很是耗時的過程,由於它須要從新計算這些元素在新table數組中的位置並進行復制處理。因此,若是咱們可以提早預知HashMap 中元素的個數,那麼在構造HashMap時預設元素的個數可以有效的提升HashMap的性能。
對hash取餘時,對2^n-1作與運算便可。
這樣能夠保證最大的利用率和最小的碰撞機會。
咱們知道 java.util.HashMap 不是線程安全的,所以若是在使用迭代器的過程當中有其餘線程修改了 map,那麼將拋出 ConcurrentModificationException,這就是所謂 fail-fast 策略。
在迭代過程當中,判斷 modCount 跟 expectedModCount 是否相等,若是不相等就表示已經有其餘線程修改了 Map:
注意到 modCount 聲明爲 volatile,保證線程之間修改的可見性。
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 的迭代器,它使用其維護的雙向鏈表進行迭代輸出。
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。
沒幹啥,只是聲明爲同步
public class ConcurrentHashMap<K,V> extends AbstractMap<K,V>
implements ConcurrentMap<K,V>, Serializable {
使用樂觀鎖(asTabAt)進行同步控制的。
比HashTable(使用synchronized)性能要高的多。
public interface SortedMap<K,V> extends Map<K,V>
比較、排序
public interface NavigableMap<K,V> extends SortedMap<K,V> {
添加了導航功能(返回和給定元素有響應關係的元素):
Lower,floor,ceiling,higher,pollFirst,pollLast
public class TreeMap<K,V>
extends AbstractMap<K,V>
implements NavigableMap<K,V>, Cloneable, java.io.Serializable
TreeMap實現了紅黑樹的結構,造成了一顆二叉樹。
特徵:
一、 用紅黑樹實現了插入時的天然排序
二、 紅黑樹的好處:平衡二叉樹,查詢效率高。
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徹底解析