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

Java集合之Vector原始碼分析

概述

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

Vector原始碼分析

1.主要欄位

Java集合之Vector

 

2.建構函式

Java集合之Vector

 

Java集合之Vector

 

3.增刪改查

Java集合之Vector

 

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

Java集合之Vector

 

Java集合之Vector

 

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 部分原始碼:

Java集合之Vector

 

Java集合之Vector

 

Java集合之Vector

 

Java集合之Vector

 

Java集合之Vector

 

從程式碼中, 我們可以看出:

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

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

Java集合之Vector

 

但是之後的但是, 如果想要把LinkedList變成執行緒安全的, 那麼我們可以將已有的LinkedList直接轉成SynchronizedList, 而不用改變它的底層資料結構, 這一點是Vector無法做到的, 因為Vector底層結構是使用陣列的, 這一點是無法更改的.

總結兩者區別如下:

  1. SynchronizedList有很好的擴充套件和相容功能, 可以將所有的List子類轉成執行緒安全的類
  2. 使用SynchronizedList在遍歷的時候要手動進行同步處理
  3. SynchronizedList可以指定鎖物件

 

 

可以關注一下鄙人的公眾號, 謝謝各位了!