Android基礎之Java集合框架Collection



1、Collection是什麼數組

JavaCollection.png

首先咱們一塊兒來探討一下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 移除並返回隊列頭部的元素 若是隊列爲空,則阻塞


相關文章
相關標籤/搜索