方法 功能 源碼關鍵邏輯 時間複雜度
addElement(obj)尾部添加 ensureCapacityHelper(elementCount+1); elementData[elementCount++] = obj;均攤 O(1)
insertElementAt(obj, index)指定位置插入 System.arraycopy(elementData, index, elementData, index+1, elementCount-index); elementData[index]=obj; elementCount++;O(n-index)
setElementAt(obj, index)指定位置替換 elementData[index] = obj;O(1)
removeElement(obj)刪除首個匹配元素 int i = indexOf(obj); if(i>=0) removeElementAt(i);O(n)
removeAllElements()清空 for(i=0;iO(n)
elementAt(index) / get(index)按索引獲取 return elementData[index];O(1)
size() / capacity()大小/容量 return elementCount; / return elementData.length;O(1)
實戰應用模式
模式一:線程安全的簡單共享列表 (無需高併發吞吐)
// 多線程環境下收集日志/事件
Vector eventLog = new Vector<>();
// 生產者線程
eventLog.addElement("UserLogin: " + userId);
// 消費者線程 (定期批量處理)
List batch;
synchronized (eventLog) { // 復合操作需額外同步
batch = new ArrayList<>(eventLog);
eventLog.removeAllElements();
}
processBatch(batch);
注意 :Vector 單方法原子性不足以保證復合操作 (如「檢查後獲取」、「遍歷中修改」) 線程安全,仍需外部同步。高併發場景推薦 CopyOnWriteArrayList 或 ConcurrentLinkedQueue。
模式二:跨層參數傳遞容器 (歷史模式)
早期 J2EE (Servlet/JSP/EJB) 傳遞非結構化參數組:
// Interface 定義共享協議
interface CodeSelect { Vector codeSelect = new Vector(); }
// Panel 層:用戶輸入 → Vector
public boolean handleEvent(Event e) {
if (e.target instanceof TextField)
codeSelect.setElementAt(tf.getText(), 0); // 學號
else if (e.target instanceof Choice)
codeSelect.setElementAt(new Integer(choice.getSelectedIndex()), 1); // 科目索引
}
// Canvas/服務層:從 Vector 解析
String studentId = (String) codeSelect.elementAt(0);
int subjectIdx = ((Integer) codeSelect.elementAt(1)).intValue();
現代替代 :定義強類型 DTO/VO 類 (StudentQueryParam),利用 Bean 映射框架 (MapStruct/Dozer) 或手動裝配,編譯期類型安全、IDE 重構友好、文檔化。
模式三:作為堆棧/隊列簡易實現
// 堆棧 (LIFO)
Vector stack = new Vector<>();
stack.addElement(item); // push
Object top = stack.lastElement(); // peek
stack.removeElementAt(stack.size()-1); // pop
// 隊列 (FIFO) —— 效率低,僅教學用
Vector queue = new Vector<>();
queue.addElement(item); // enqueue
Object front = queue.firstElement(); // peek
queue.removeElementAt(0); // dequeue → O(n) 位移開銷大
生產環境堆棧用 ArrayDeque,隊列用 ArrayDeque/LinkedBlockingQueue。
性能對比與選型決策樹
需要線程安全?
├─ 是 → 併發度高? → 是 → ConcurrentLinkedQueue / CopyOnWriteArrayList / ConcurrentHashMap
│ └─ 否 → Collections.synchronizedList(new ArrayList()) / Vector (簡單場景)
└─ 否 → ArrayList (首選) / LinkedList (頻繁頭尾增刪)
遷移指南:Vector → ArrayList
全局替換 Vector → ArrayList (導入 java.util.ArrayList)。
移除 capacityIncrement 相關構造調用,使用 new ArrayList(initialCapacity)。
替換專有方法:addElement→add、elementAt→get、insertElementAt→add(index,obj)、setElementAt→set、removeElement→remove(Object)、removeAllElements→clear。
檢查同步鎖:原 Vector 方法自帶 synchronized,遷移後若多線程共享,**必須**添加外部同步或改用併發集合。
運行測試驗證功能與性能。
上一篇文章: J2ME 應用極致優化 20 條鐵律:從字節碼到架構層面的性能調優全指南 下一篇文章: Jini 技術架構深度解析:設備即插即用的網絡計算新范式
Copyright ©
程式碼之家 All Rights Reserved