集合包系列三 —— Vector

本系列文章所描述的所有類或接口都是基于 JDK 1.7的源碼炸站,在其它 JDK 的實(shí)現(xiàn)方式中可能會有所不同攘已。

一、實(shí)現(xiàn)方式

Vector 和 ArrayList 一樣透绩,也是基于 Object 數(shù)組的方式來實(shí)現(xiàn)的产阱。

二狡赐、創(chuàng)建 Vector

默認(rèn)創(chuàng)建一個大小為 10 的 Object 數(shù)組稚虎,并將 capacityIncrement 設(shè)置為 0乡范。此外還提供了三個構(gòu)造函數(shù):Vector(int initialCapacity)奸柬、Vector(int initialCapacity, int capacityIncrement)生年、Vector(Collection<? extends E> c)。

    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;
    }

三廓奕、添加元素 add(E)

Vector 中的 add 方法是加了 synchronized 關(guān)鍵字的抱婉,因此此方法是線程安全的档叔。除此之外,它和 ArrayList 基本相同蒸绩,不同點(diǎn)是當(dāng)數(shù)組大小不夠時衙四,其擴(kuò)展數(shù)組的方法有所不同,Vector 的策略為:
  如果 capacityIncrement 大于 0患亿,則將 Object 數(shù)組的大小擴(kuò)大為現(xiàn)有 size 加上 capacityIncrement 的值传蹈;如果 capacityIncrement 等于或小于 0,則將 Object 數(shù)組的大小擴(kuò)大為現(xiàn)有 size 的兩倍步藕,這種容量的控制策略比 ArrayList 更為可控惦界。

    public synchronized boolean add(E e) {
        modCount++;
        ensureCapacityHelper(elementCount + 1);
        elementData[elementCount++] = e;
        return true;
    }

    private void ensureCapacityHelper(int minCapacity) {
        // overflow-conscious code
        if (minCapacity - elementData.length > 0)
            grow(minCapacity);
    }

    private void grow(int minCapacity) {
        // overflow-conscious code
        int oldCapacity = elementData.length;
        int newCapacity = oldCapacity + ((capacityIncrement > 0) ?
                                         capacityIncrement : oldCapacity);
        if (newCapacity - minCapacity < 0)
            newCapacity = minCapacity;
        if (newCapacity - MAX_ARRAY_SIZE > 0)
            newCapacity = hugeCapacity(minCapacity);
        elementData = Arrays.copyOf(elementData, newCapacity);
    }

四、刪除元素 remove(E)

除了其調(diào)用的 removeElement 方法上有 synchronized 關(guān)鍵字外咙冗,和 ArrayList 完全相同沾歪。

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

    public synchronized boolean removeElement(Object obj) {
        modCount++;
        int i = indexOf(obj);
        if (i >= 0) {
            removeElementAt(i);
            return true;
        }
        return false;
    }

五、獲取單個元素 get(int)

此方法同樣有 synchronized 關(guān)鍵字乞娄,實(shí)現(xiàn)和 ArrayList 相同瞬逊。

    public synchronized E get(int index) {
        if (index >= elementCount)
            throw new ArrayIndexOutOfBoundsException(index);

        return elementData(index);
    }

六、遍歷元素 iterator()

此方法同樣有 synchronized 關(guān)鍵字仪或,實(shí)現(xiàn)和 ArrayList 相同确镊。

    public synchronized Iterator<E> iterator() {
        return new Itr();
    }

七、判斷對象是否存在:contains(E)

和 ArrayList 唯一不同是 contains 中調(diào)用的 indexOf 方法是有 synchronized 關(guān)鍵字的范删。

    public boolean contains(Object o) {
        return indexOf(o, 0) >= 0;
    }

    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;
    }

根據(jù)上面的分析蕾域,可以看出,Vector 除了擴(kuò)大數(shù)組時采用的方法和 ArrayList 不同及線程安全外到旦,其它實(shí)現(xiàn)完全相同旨巷。

八、注意要點(diǎn)

對于 Vector 而言添忘,最要注意的只有一點(diǎn):
  Vector 是基于 synchronized 實(shí)現(xiàn)的線程安全的 ArrayList采呐,但在插入元素時容量擴(kuò)充的機(jī)制和 ArrayList 稍有不同,并可通過傳入 capacityIncrement 來控制容量的擴(kuò)充搁骑。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末斧吐,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子仲器,更是在濱河造成了極大的恐慌煤率,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,183評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件乏冀,死亡現(xiàn)場離奇詭異蝶糯,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)辆沦,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,850評論 3 399
  • 文/潘曉璐 我一進(jìn)店門昼捍,熙熙樓的掌柜王于貴愁眉苦臉地迎上來识虚,“玉大人,你說我怎么就攤上這事端三∠侠瘢” “怎么了?”我有些...
    開封第一講書人閱讀 168,766評論 0 361
  • 文/不壞的土叔 我叫張陵郊闯,是天一觀的道長妻献。 經(jīng)常有香客問我,道長团赁,這世上最難降的妖魔是什么育拨? 我笑而不...
    開封第一講書人閱讀 59,854評論 1 299
  • 正文 為了忘掉前任,我火速辦了婚禮欢摄,結(jié)果婚禮上熬丧,老公的妹妹穿的比我還像新娘。我一直安慰自己怀挠,他們只是感情好析蝴,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,871評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著绿淋,像睡著了一般闷畸。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上吞滞,一...
    開封第一講書人閱讀 52,457評論 1 311
  • 那天佑菩,我揣著相機(jī)與錄音,去河邊找鬼裁赠。 笑死殿漠,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的佩捞。 我是一名探鬼主播绞幌,決...
    沈念sama閱讀 40,999評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼一忱!你這毒婦竟也來了莲蜘?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,914評論 0 277
  • 序言:老撾萬榮一對情侶失蹤掀潮,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后琼富,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體仪吧,經(jīng)...
    沈念sama閱讀 46,465評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,543評論 3 342
  • 正文 我和宋清朗相戀三年鞠眉,在試婚紗的時候發(fā)現(xiàn)自己被綠了薯鼠。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片择诈。...
    茶點(diǎn)故事閱讀 40,675評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖出皇,靈堂內(nèi)的尸體忽然破棺而出羞芍,到底是詐尸還是另有隱情,我是刑警寧澤郊艘,帶...
    沈念sama閱讀 36,354評論 5 351
  • 正文 年R本政府宣布荷科,位于F島的核電站,受9級特大地震影響纱注,放射性物質(zhì)發(fā)生泄漏畏浆。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,029評論 3 335
  • 文/蒙蒙 一狞贱、第九天 我趴在偏房一處隱蔽的房頂上張望刻获。 院中可真熱鬧,春花似錦瞎嬉、人聲如沸蝎毡。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,514評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽沐兵。三九已至,卻和暖如春挑胸,著一層夾襖步出監(jiān)牢的瞬間痒筒,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,616評論 1 274
  • 我被黑心中介騙來泰國打工茬贵, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留簿透,地道東北人。 一個月前我還...
    沈念sama閱讀 49,091評論 3 378
  • 正文 我出身青樓解藻,卻偏偏與公主長得像老充,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子螟左,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,685評論 2 360

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

  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法啡浊,類相關(guān)的語法,內(nèi)部類的語法胶背,繼承相關(guān)的語法巷嚣,異常的語法,線程的語...
    子非魚_t_閱讀 31,664評論 18 399
  • (一)Java部分 1钳吟、列舉出JAVA中6個比較常用的包【天威誠信面試題】 【參考答案】 java.lang;ja...
    獨(dú)云閱讀 7,116評論 0 62
  • 一、基本數(shù)據(jù)類型 注釋 單行注釋:// 區(qū)域注釋:/* */ 文檔注釋:/** */ 數(shù)值 對于byte類型而言...
    龍貓小爺閱讀 4,268評論 0 16
  • Collection接口 Collection接口是所有集合的祖先類坝茎。他有兩個構(gòu)造方法涤姊,一個無參構(gòu)造,一個是帶Co...
    夜幕繁華閱讀 598評論 0 0
  • 手種青梅閱讀 401評論 1 2