首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java Vector 源碼深度解析:線程安全的動態數組實現

     編輯:Java 相關知識

Vector 概述

Vector 是 JDK 1.0 就引入的動態數組實現,底層基於 Object[] 數組,支持自動擴容。與 ArrayList 不同,Vector 的大多數方法都加上了 synchronized 關鍵字,因此是線程安全的(但僅是相對安全,複雜場景仍需額外同步)。Vector 實現了 Serializable、Cloneable 和 RandomAccess 接口,支持序列化、克隆和快速隨機訪問。

核心字段與構造函數

關鍵字段

protected Object[] elementData;  // 存儲數據的數組
protected int elementCount;      // 實際元素數量
protected int capacityIncrement; // 容量增長系數

四種構造函數

  • Vector():默認容量 10,增量 0
  • Vector(int initialCapacity):指定初始容量,增量 0
  • Vector(int initialCapacity, int capacityIncrement):指定容量與增量
  • Vector(Collection c):從集合創建

增量 capacityIncrement 為 0 時擴容策略為翻倍,否則按增量增長。

核心方法解析

擴容機制:ensureCapacityHelper

private void ensureCapacityHelper(int minCapacity) {
    int oldCapacity = elementData.length;
    if (minCapacity > oldCapacity) {
        Object[] oldData = elementData;
        int newCapacity = (capacityIncrement > 0) ? 
            (oldCapacity + capacityIncrement) : (oldCapacity * 2);
        if (newCapacity < minCapacity) newCapacity = minCapacity;
        elementData = Arrays.copyOf(elementData, newCapacity);
    }
}

與 ArrayList 的 1.5 倍增長不同,Vector 支持自定義增量或翻倍策略。

同步方法特點

關鍵操作方法均標註 synchronized:

  • addElement、insertElementAt、removeElementAt
  • get、set、size、capacity
  • indexOf、lastIndexOf、contains
  • trimToSize、ensureCapacity、setSize

這保證了單個方法調用的原子性,但複合操作(如迭代期間修改)仍需外部同步。

元素查找與空值處理

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

將 null 與非 null 分開處理,避免空指針異常,允許存儲 null 元素。

Enumeration 實現

elements() 返回匿名內部類實現的 Enumeration,內部同步保證迭代安全:

public Enumeration elements() {
    return new Enumeration() {
        int count = 0;
        public boolean hasMoreElements() { return count < elementCount; }
        public E nextElement() {
            synchronized (Vector.this) {
                if (count < elementCount) return (E)elementData[count++];
            }
            throw new NoSuchElementException("Vector Enumeration");
        }
    };
}

Vector vs ArrayList 核心差異

特性VectorArrayList
線程安全同步方法,線程安全非線程安全
擴容策略翻倍或自定義增量1.5倍 + 1
性能同步開銷大,較慢無同步,較快
推薦場景舊代碼維護、簡單多線程現代開發首選

最佳實踐建議

  1. 新項目優先使用 ArrayList,配合 Collections.synchronizedList 或 CopyOnWriteArrayList 實現線程安全
  2. 若必須用 Vector,注意複合操作需額外加鎖
  3. 預估數據量設置初始容量,減少擴容開銷
  4. 避免在高併發熱點路徑使用 Vector,考慮 Concurrent 包替代方案

總結

Vector 作為早期集合類,通過方法級同步實現線程安全,但同步粒度較粗、擴容策略固定、性能較差。現代 Java 開發中已很少直接使用,理解其實現有助於掌握集合框架演進歷史與同步機制設計。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved