1. 程式人生 > >Java集合之Vector源碼分析

Java集合之Vector源碼分析

array 函數 arr stat 一點 子類 collect 1.5 util

概述

Vector與ArrayLIst類似, 內部同樣維護一個數組, Vector是線程安全的. 方法與ArrayList大體一致, 只是加上 synchronized 關鍵字, 保證線程安全, 下面就不具體分析源碼了, 具體可以查看ArrayList中的源碼分析.

Vector源碼分析

1.主要字段

技術分享圖片

2.構造函數

技術分享圖片

技術分享圖片

3.增刪改查

技術分享圖片

其他方法大部分類似, 不再贅述, 下面看下擴容機制的函數:

技術分享圖片

技術分享圖片

Vector與ArrayList的區別

  1. Vector是線程安全的, ArrayList不是線程安全的, 這是最主要的
  2. ArrayList不可以設置擴展的容量, 默認1.5倍; Vector可以設置, 默認2倍
  3. ArrayList無參構造函數中初始量為0; Vector的無參構造函數初始容量為10

Vector與Collections.synchronizedList

Vector是java.util包中的一個類。 SynchronizedList是java.util.Collections中的一個靜態內部類。

在多線程的場景中可以直接使用Vector類,也可以使用Collections.synchronizedList(List list)方法來返回一個線程安全的List。

那麽,到底SynchronizedList和Vector有沒有區別,為什麽java api要提供這兩種線程安全的List的實現方式呢?

以下看 synchronizedList 部分源碼:

技術分享圖片

技術分享圖片

技術分享圖片

技術分享圖片

技術分享圖片

從代碼中, 我們可以看出:

  1. Vector使用同步方法實現, synchronizedList使用同步代碼塊實現
  2. 兩者的擴容數組容量方式不一樣(兩者在擴容方面的差別就是ArrayList和Vector的差別)

但是, SynchronizedList中 listlterator方法並沒有做同步處理, 但是在Vector卻對該方法加了方法鎖. 所以, 在使用SynchronizedList進行遍歷的時候要手動加鎖.

技術分享圖片

但是之後的但是, 如果想要把LinkedList變成線程安全的, 那麽我們可以將已有的LinkedList直接轉成SynchronizedList, 而不用改變它的底層數據結構, 這一點是Vector無法做到的, 因為Vector底層結構是使用數組的, 這一點是無法更改的.

總結兩者區別如下:

  1. SynchronizedList有很好的擴展和兼容功能, 可以將所有的List子類轉成線程安全的類
  2. 使用SynchronizedList在遍歷的時候要手動進行同步處理
  3. SynchronizedList可以指定鎖對象

可以關註一下鄙人的公眾號, 謝謝各位了!技術分享圖片

Java集合之Vector源碼分析