Vector詳解(Java)

Vector是Java的一個List實(shí)現(xiàn)類(實(shí)現(xiàn)List接口)

Vector 類實(shí)現(xiàn)了一個動態(tài)數(shù)組宰衙。和 ArrayList 很相似能岩,但是兩者是不同的:
Vector 主要用在事先不知道數(shù)組的大小,或者只是需要一個可以改變大小的數(shù)組的情況株灸。
Vector 類支持 4 種構(gòu)造方法崇摄。
源碼如下:

1.第一種構(gòu)造方法創(chuàng)建一個默認(rèn)的向量,默認(rèn)大小為 10:

public Vector() {
        this(10);
    }

2.第二種構(gòu)造方法創(chuàng)建指定大小的向量慌烧。

public Vector(int initialCapacity) {
        this(initialCapacity, 0);
    }

3.第三種構(gòu)造方法創(chuàng)建指定大小的向量逐抑,并且增量用 capacityIncrement 指定。增量表示向量每次增加的元素數(shù)目杏死。

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

4.第四種構(gòu)造方法創(chuàng)建一個包含集合 c 元素的向量:

public Vector(Collection<? extends E> c) {
        elementData = c.toArray();
        elementCount = elementData.length;
        // defend against c.toArray (incorrectly) not returning Object[]
        // (see e.g. https://bugs.openjdk.java.net/browse/JDK-6260652)
        if (elementData.getClass() != Object[].class)
            elementData = Arrays.copyOf(elementData, elementCount, Object[].class);
    }
Vector常用的方法:

1.返回Vector的容量(記住是容量不是大斜靡蕖)

public synchronized int capacity() {
        return elementData.length;
    }

2.返回Vector的大小(這才是大小淑翼,這是在Collection接口里面就定義的方法腐巢,用過List的肯定知道)

public synchronized int size() {
        return elementCount;
    }

3.返回Vector是否為空(這也是在Collection接口里面就定義的方法,用過List的肯定也知道)

public synchronized boolean isEmpty() {
        return elementCount == 0;
    }

4.返回Vector中遇到的第一個匹配的元素的下表

public int indexOf(Object o) {
        return indexOf(o, 0);
    }

5.在此向量的指定位置插入指定的元素玄括。

public void add(E e) {
            int i = cursor;
            synchronized (Vector.this) {
                checkForComodification();
                Vector.this.add(i, e);
                expectedModCount = modCount;
            }
            cursor = i + 1;
            lastRet = -1;
        }

6冯丙。將指定元素添加到此向量的末尾。

public synchronized boolean add(E e) {
        modCount++;
        add(e, elementData, elementCount);
        return true;
    }

7.將指定 Collection 中的所有元素添加到此向量的末尾遭京,按照指定 collection 的迭代器所返回的順序添加這些元素胃惜。

public boolean addAll(Collection<? extends E> c) {
        Object[] a = c.toArray();
        modCount++;
        int numNew = a.length;
        if (numNew == 0)
            return false;
        synchronized (this) {
            Object[] elementData = this.elementData;
            final int s = elementCount;
            if (numNew > elementData.length - s)
                elementData = grow(s + numNew);
            System.arraycopy(a, 0, elementData, s, numNew);
            elementCount = s + numNew;
            return true;
        }
    }

8.在指定位置將指定 Collection 中的所有元素插入到此向量中。

public synchronized boolean addAll(int index, Collection<? extends E> c) {
        if (index < 0 || index > elementCount)
            throw new ArrayIndexOutOfBoundsException(index);

        Object[] a = c.toArray();
        modCount++;
        int numNew = a.length;
        if (numNew == 0)
            return false;
        Object[] elementData = this.elementData;
        final int s = elementCount;
        if (numNew > elementData.length - s)
            elementData = grow(s + numNew);

        int numMoved = s - index;
        if (numMoved > 0)
            System.arraycopy(elementData, index,
                             elementData, index + numNew,
                             numMoved);
        System.arraycopy(a, 0, elementData, index, numNew);
        elementCount = s + numNew;
        return true;
    }

9.將指定的組件添加到此向量的末尾哪雕,將其大小增加 1船殉。

public synchronized void addElement(E obj) {
        modCount++;
        add(obj, elementData, elementCount);
    }

10.移除此向量中指定位置的元素。

public synchronized E remove(int index) {
        modCount++;
        if (index >= elementCount)
            throw new ArrayIndexOutOfBoundsException(index);
        E oldValue = elementData(index);

        int numMoved = elementCount - index - 1;
        if (numMoved > 0)
            System.arraycopy(elementData, index+1, elementData, index,
                             numMoved);
        elementData[--elementCount] = null; // Let gc do its work

        return oldValue;
    }

11.移除此向量中指定元素的第一個匹配項(xiàng)斯嚎,如果向量不包含該元素利虫,則元素保持不變挨厚。

public boolean remove(Object o) {
        return removeElement(o);
    }

12.從此向量中移除包含在指定 Collection 中的所有元素。

public boolean removeAll(Collection<?> c) {
        Objects.requireNonNull(c);
        return bulkRemove(e -> c.contains(e));
    }

13.從此向量中移除全部組件糠惫,并將其大小設(shè)置為零疫剃。

public synchronized void removeAllElements() {
        final Object[] es = elementData;
        for (int to = elementCount, i = elementCount = 0; i < to; i++)
            es[i] = null;
        modCount++;
    }

14.對此向量的容量進(jìn)行微調(diào),使其等于向量的當(dāng)前大小硼讽。

public synchronized void trimToSize() {
        modCount++;
        int oldCapacity = elementData.length;
        if (elementCount < oldCapacity) {
            elementData = Arrays.copyOf(elementData, elementCount);
        }
    }

這些基本就是我常用的幾個函數(shù)巢价,當(dāng)然,還有好多固阁,可以考慮去看看源碼

你可能會問這個E是什么類型壤躲,沒見過啊1溉肌F饩簟!

其實(shí)很簡單赚爵,E是一個繼承Object的類
所以你就把他暫時當(dāng)作Object理解應(yīng)該暫時也不會遇到大問題!法瑟!
另外附上我抄來的一段代碼冀膝,這些代碼可以有效地幫你理解Vector怎么工作的

import java.util.*;
import java.util.function.Consumer;

public class VectorTest {


    public static void main(String args[]) {
        // initial size is 3, increment is 2
        Vector v = new Vector(3, 2);

        System.out.println("Initial size: " + v.size());//組件數(shù)
        System.out.println("Initial capacity: " + v.capacity());//容量

        v.addElement(1);
        v.addElement(2);
        v.addElement(3);
        v.addElement(4);
        System.out.println("Capacity after four additions: " + v.capacity());

        v.addElement(5.45);
        System.out.println("Current capacity five additions: " + v.capacity());

        v.addElement(6.08);
        v.addElement(7);
        System.out.println("Current capacity seven additions: " + v.capacity());

        v.addElement(8.4f);
        v.addElement(9);
        System.out.println("Current capacity nine additions: " + v.capacity());

        v.addElement(10);
        v.addElement(11);

        System.out.println("First element: " + v.firstElement());
        System.out.println("Last element: " + v.lastElement());


        if (v.contains(3))
            System.out.println("Vector contains 3.");

        //這是迭代遍歷Vector的方法,這種寫的是Lambda表達(dá)式霎挟,是Java8以后新添的功能窝剖,如果不習(xí)慣,也可以按老方法寫
        v.forEach(o -> System.out.print(o + " "));

        //這就是老方法的樣子了
        v.forEach(new Consumer() {
            @Override
            public void accept(Object o) {
                System.out.print(o+" ");
            }
        });
  
        System.out.println();
    }
}

輸出結(jié)果:

Initial size: 0
Initial capacity: 3
Capacity after four additions: 5
Current capacity five additions: 5
Current capacity seven additions: 7
Current capacity nine additions: 9
First element: 1
Last element: 11
Vector contains 3.
1 2 3 4 5.45 6.08 7 8.4 9 10 11 1 2 3 4 5.45 6.08 7 8.4 9 10 11 
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末酥夭,一起剝皮案震驚了整個濱河市赐纱,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌熬北,老刑警劉巖疙描,帶你破解...
    沈念sama閱讀 206,602評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異讶隐,居然都是意外死亡起胰,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,442評論 2 382
  • 文/潘曉璐 我一進(jìn)店門巫延,熙熙樓的掌柜王于貴愁眉苦臉地迎上來效五,“玉大人,你說我怎么就攤上這事炉峰∥费” “怎么了?”我有些...
    開封第一講書人閱讀 152,878評論 0 344
  • 文/不壞的土叔 我叫張陵疼阔,是天一觀的道長戒劫。 經(jīng)常有香客問我半夷,道長,這世上最難降的妖魔是什么谱仪? 我笑而不...
    開封第一講書人閱讀 55,306評論 1 279
  • 正文 為了忘掉前任玻熙,我火速辦了婚禮,結(jié)果婚禮上疯攒,老公的妹妹穿的比我還像新娘嗦随。我一直安慰自己,他們只是感情好敬尺,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,330評論 5 373
  • 文/花漫 我一把揭開白布枚尼。 她就那樣靜靜地躺著,像睡著了一般砂吞。 火紅的嫁衣襯著肌膚如雪署恍。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,071評論 1 285
  • 那天蜻直,我揣著相機(jī)與錄音盯质,去河邊找鬼。 笑死概而,一個胖子當(dāng)著我的面吹牛呼巷,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播赎瑰,決...
    沈念sama閱讀 38,382評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼王悍,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了餐曼?” 一聲冷哼從身側(cè)響起压储,我...
    開封第一講書人閱讀 37,006評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎源譬,沒想到半個月后集惋,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,512評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡踩娘,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,965評論 2 325
  • 正文 我和宋清朗相戀三年芋膘,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片霸饲。...
    茶點(diǎn)故事閱讀 38,094評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡为朋,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出厚脉,到底是詐尸還是另有隱情习寸,我是刑警寧澤,帶...
    沈念sama閱讀 33,732評論 4 323
  • 正文 年R本政府宣布傻工,位于F島的核電站霞溪,受9級特大地震影響孵滞,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜鸯匹,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,283評論 3 307
  • 文/蒙蒙 一坊饶、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧殴蓬,春花似錦匿级、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,286評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至肖粮,卻和暖如春孤页,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背涩馆。 一陣腳步聲響...
    開封第一講書人閱讀 31,512評論 1 262
  • 我被黑心中介騙來泰國打工行施, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人魂那。 一個月前我還...
    沈念sama閱讀 45,536評論 2 354
  • 正文 我出身青樓悲龟,卻偏偏與公主長得像,于是被迫代替她去往敵國和親冰寻。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,828評論 2 345

推薦閱讀更多精彩內(nèi)容