java集合框架>>>>Vector

 

目錄

前言

類的簡介

構造方法

1. public Vector() {}

2. public Vector(int initialCapacity) {}

3. public Vector(int initialCapacity, int capacityIncrement) {}

4. public Vector(Collection c)

其他方法:

1. public int size()

2. public synchronized boolean isEmpty()

3. public Enumeration elements()

4. public boolean contains(Object o)

5. public int indexOf(Object o)

6. public synchronized int indexOf(Object o, int index)

7. public synchronized int lastIndexOf(Object o, int index)

8. public synchronized int lastIndexOf(Object o)

9. public synchronized E elementAt(int index)

...

總結:


前言

Vector和ArrayList很相似,可能唯一差別,就是Vector是線程安全的,因爲Vector大部分方法都是由synchronized修飾的,因此Vector更適合多線程,ArrayList更適合單線程

public class Vector<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, Serializable

public class ArrayList<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, Serializable

二者都繼承AbstractList<E>這個抽象類,因此大部分方法也是繼承自這個類,因此大家可以參考我前面寫的文章,對比學習

Java集合框架----ArrayList

因此這篇博客,直接根據API查看主要方法,簡單分析一下實現

類的簡介

Vector類主要參數以及構造方法如下

public class Vector<E>
    extends AbstractList<E>
    implements List<E>, RandomAccess, Cloneable, java.io.Serializable
{
    //數據元素
    protected Object[] elementData;
    //集合大小,相當於ArrayList的size屬性
    protected int elementCount;
    //擴充集合時,每次增加量,當需要擴充容量時
    protected int capacityIncrement;
    
    //構造方法

    //其他方法

}

主要屬性

elementData,用來存儲元素

elementCount,記錄當前集合的長度

capacityIncrement,擴容時每次增加的容量,默認爲0

構造方法

1. public Vector() {}

2. public Vector(int initialCapacity) {}

3. public Vector(int initialCapacity, int capacityIncrement) {}

看起來是四種構造方法,其實也就是兩種,附前三種構造方法的源碼

    public Vector() {
        this(10);
    }

    public Vector(int initialCapacity) {
        this(initialCapacity, 0);
    }
    public Vector(int initialCapacity, int capacityIncrement) {
        super();
        if (initialCapacity < 0)
            throw new IllegalArgumentException("Illegal Capacity: "+
                                               initialCapacity);
        this.elementData = new Object[initialCapacity];
        this.capacityIncrement = capacityIncrement;
    }

都是隱式的調用了第三種構造方法,初始化elementData,以及capacityIncrement參數,如果初始容量小於0,則拋出異常

當時腦子不知道怎麼想的,,,糾結了一個問題,怎麼構造方法中沒有設置elementCount的值,elementCount未設置初始值,默認爲0,那麼此時獲取Vector不就是0嗎,那麼初始容量爲10???

只是初始化elementData的容量爲10,但是沒有往裏面添加元素,因此就不需要管elementCount,此時調用size返回0,也是正常,因爲這就是個空的集合

需要注意的是:

如果沒有給capacityIncrement設置初始值,則每次給集合擴容,都是將集合擴大一倍

4. public Vector(Collection<? extends E> c)

構造一個包含指定集合元素的向量,按照集合的迭代器返回的順序。

    public Vector(Collection<? extends E> c) {
        elementData = c.toArray();
        elementCount = elementData.length;
        // c.toArray might (incorrectly) not return Object[] (see 6260652)
        if (elementData.getClass() != Object[].class)
            elementData = Arrays.copyOf(elementData, elementCount, Object[].class);
    }

將參數Collection調用toArray方法轉化爲Object[]並賦值給elementData

更新集合長度elementCount

同時進行容錯處理,如果toArray方法返回錯誤類型,也就是說第一行賦值出現錯誤,可能類型不一致,因此在調用Arrays.copyOf方法重新賦值

其他方法:

Vector是線程安全的,因此所有方法都帶有"synchronized"修飾

1. public int size()

返回Vector集合元素個數

詳情參考ArrayList部分的源碼分析

2. public synchronized boolean isEmpty()

判斷集合長度是否爲空

詳情參考ArrayList部分的源碼分析

3. public Enumeration<E> elements()

Enumeration貌似已經被Iterator迭代器取代了...

這裏不在做分析

4. public boolean contains(Object o)

如果集合包含指定的元素,則返回true 。 更正式地,返回true當且僅當該向量包含至少一個元素e使得(o==null ? e==null : o.equals(e)) 

其實就是調用IndexOf方法,如果返回值大於0,則證明存在該對象

5. public int indexOf(Object o)

返回參數對象在該集合中第一次出現的索引,如果不存在,則返回-1

其實就是調用indexOf(Object o,index i)這個方法,從index位置處開始檢索

6. public synchronized int indexOf(Object o, int index)

    public synchronized int indexOf(Object o, int index) {
        if (o == null) {
            for (int i = index ; i < elementCount ; i++)
                if (elementData[i]==null)
                    return i;
        } else {
            for (int i = index ; i < elementCount ; i++)
                if (o.equals(elementData[i]))
                    return i;
        }
        return -1;
    }

從index位置開始檢索,檢索到則返回索引,否則返回-1

7. public synchronized int lastIndexOf(Object o, int index)

返回此向量中指定元素的最後一次出現的索引,從index ,如果未找到該元素,則返回-1。 更正式地,返回最高指數i ,使(i <= index && (o==null ? get(i)==null : o.equals(get(i)))) ,或-1如果沒有這樣的索引。

8. public synchronized int lastIndexOf(Object o)

返回此向量中指定元素的最後一次出現的索引,如果此向量不包含元素,則返回-1。 更正式地,返回最高指數i ,使(o==null ? get(i)==null : o.equals(get(i))) ,或-1如果沒有這樣的索引。

9. public synchronized E elementAt(int index)

相當於get(int index)

返回指定索引處的組件

...

其餘方法均繼承自AbstractList,ArrayList部分已經分析過,實現思路基本相同,這裏不在分析

詳情見

Java集合框架----ArrayList

總結:

實質上,Vector就是ArrayList的一個強化版,所有方法均是同步的,因此使用多線程時Vector更適合

而不實用多線程,ArrayList性能則更好

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