1、Collection是什麼數組
首先咱們一塊兒來探討一下Collection到底是什麼個玩意,如上圖所示List、Set、Queue、Map都指向Collection,它們都只是一個接口,並非實現類。正由於有了Collection集合框架,使咱們能方便的批量操做數據或對象。安全
2、List
List是有序的Collection,咱們能夠很是輕鬆的來控制數據插入的位置,而且也能根據其索引來訪問List中的某個元素。
其實List實現類仍是挺多的【AbstractList, AbstractSequentialList, ArrayList, CopyOnWriteArrayList, LinkedList, Stack, Vector】,但今天咱們主要來說講經常使用的類ArrayList、LinkedList、Vector。框架
2.1 ArrayList
看名稱就知道Arraylist是基於數組的鏈表,且線程不一樣步。咱們能夠看下其實現的add方法源碼:ide
@Override public boolean add(E object) { Object[] a = array; int s = size; if (s == a.length) { Object[] newArray = new Object[s + (s < (MIN_CAPACITY_INCREMENT / 2) ? MIN_CAPACITY_INCREMENT : s >> 1)]; System.arraycopy(a, 0, newArray, 0, s); array = a = newArray; } a[s] = object; size = s + 1; modCount++; return true; }
2.2 Vector
Vector也是基於數組的鏈表,可是其線程是同步的【以下add方法被synchronized修飾】,其實現的add方法源碼:性能
@Override public synchronized boolean add(E object) { if (elementCount == elementData.length) { growByOne(); } elementData[elementCount++] = object; modCount++; return true; }
性能方面:Vector比Arraylist和Array都低;
線程方面:Vector線程同步,ArrayList線程不一樣步;this
2.3 LinkedList
LinkedList與Vector、ArrayList有着明顯的區別,其並不基於數組,因此對LinkedList元素進行增長、刪除時,不須要批量移動其餘元素。
其每一個節點都包含如下兩個信息:
一、該節點的數據
二、下一個節點的信息spa
小總結:基於Array的List(Vector、ArrayList)適合查詢,LinkedList適合增刪操做。.net
3、Set
Set是不包含重複的元素的無序Collection,而且Set都是基於Map實現的。
若是使用add()方法存入已存在的元素,則會覆蓋以前的元素。
基於Set實現的類有AbstractSet, CopyOnWriteArraySet, EnumSet, HashSet, LinkedHashSet, TreeSet。線程
3.1 HashSet
咱們能夠先看下HashSet中的add()方法的源碼:指針
transient HashMap<E, HashSet<E>> backingMap; @Override public boolean add(E object) { return backingMap.put(object, this) == null; }
其中backingMap爲HashMap對象,咱們應該知道HashMap是以鍵值對的形式來保存數據的,而在上述add()方法中,鍵爲傳入的對象,因此這就是Set不包含重複元素的最根本緣由。
3.2 TreeSet
TreeSet是SortedSet的子類,它與HashSet最根本的區別在於:TreeSet是有序的,由於TreeSet是基於SortedMap來實現的。
4、Map
咱們在聊Set的時候說道了HashMap,因此Map始終是以鍵值對形式存在的,而且其中的鍵是不容許重複的。
Map的常見實現有:HashMap和TreeMap。
若是咱們要往HashMap中存入數據就可使用put(Object key,Object value)方法,若是要取出數據也特別簡單,使用get(Object key)方法。
在這裏,我主要想聊聊HashMap和HashTable兩個類的區別:
1、HashTable類是基於抽象類Dictionary的,而HashMap類是基於Map接口的實現; 2、HashTable類是同步的,這就保證了線程的安全,HashMap類是不一樣步的; 3、HashTable類元素不能爲空,不然系統會拋空指針異常,而HashMap類value是能夠爲空的,固然啦,其中key也是能夠爲空的,可是若是咱們這樣設置,彷佛毫無心義。
5、Queue
Queue(隊列)先進先出,Stack(棧)後進先出。
方法名 方法含義 備註
add 增長一個元索 若是隊列已滿,則拋出一個IIIegaISlabEepeplian異常
remove 移除並返回隊列頭部的元素 若是隊列爲空,則拋出一個NoSuchElementException異常
element 返回隊列頭部的元素 若是隊列爲空,則拋出一個NoSuchElementException異常
offer 添加一個元素並返回true 若是隊列已滿,則返回false
poll 移除並返問隊列頭部的元素 若是隊列爲空,則返回null
peek 返回隊列頭部的元素 若是隊列爲空,則返回null
put 添加一個元素 若是隊列滿,則阻塞
take 移除並返回隊列頭部的元素 若是隊列爲空,則阻塞