是的, 這是一個太多太多人遇到過, 討論過, 解釋過的問題.
為了加深自己的記憶, 還是決定寫一篇來記錄下他.
首先想說的是:
Vector是在Collections API之前就已經產生了的, 而ArrayList是在JDK1.2的時候才作為Collection framework的一部分引入的. 它們都是在內部用一個Obejct[]來儲存元素的.
ok, 現在來說他們的差別:
1. 安全執行緒
Vector是同步的, 而ArrayList不是.
因為Vector是同步的, 所以它是安全執行緒的.
同樣, 因為Vecotr是同步的, 所以他需要額外的開銷來維持同步鎖, 所以它要比ArrayList要慢.(理論上來說)
當然, 如果你對ArrayList有偏好, 你也可以用Collection.synchronizedList(List)來得到一個安全執行緒的List.
2. 容量增長
Vector允許使用者佈建capacityIncrement這樣在每次需要擴充數組的size的時候, Vector會嘗試按照預先設定的capacityIncrement作為增量來設定, 而ArrayList則會把數組的大小擴大一倍.
比如現在同樣一個長度為10的Vector和ArrayList, 我們把Vector的capacityIncrement設為1
那麼我們在插入第11個對象的時候, Vector會將長度變成11, 然後分配空間, 然後將對象添加進去, 而ArrayList則會分配20個對象的空間, 然後將對象添加進去.
如果capacityIncrement設為0或者負值, Vector就會做和ArrayList一樣, 每次都將數組大小擴大一倍.
3. 效能比較
剛剛在上面已經說過了, 由於Vector是同步的, 而ArrayList不是, 所以Vector的效能要比ArrayList要稍第一點, 用效能換安全嘛.
不過, 據Jack Shirazi在OnJava上的一篇文章來看, 似乎這並不是什麼問題, 他認為對於現在的JVM來說, 這兩個類在同步這個問題上的效能差異, 甚至還不如每次跑測試的時候環境變化引起的差異大.
Consequently Vector is thread-safe, and ArrayList isn't. This makes ArrayList faster than Vector. For some of the latest JVMs the difference in speed between the two classes is negligible: strictly speaking, for these JVMs the difference in speed between the two classes is less than the variation in times obtained from tests comparing the performance of these classes. ---- The Performance of Java's Lists
這樣看來, 效能上的差別應該不大.
So, as a conclusion.
結論和網上大多數人得到的結論一樣:
在一般情況下, 還是鼓勵用ArrayList的, 如果你有同步控制的需要, 那就用Vector吧, 也懶得用Collection.synchronizedList(List)再去轉一次了, 除非非這樣不可.. 不然還是順應潮流, 畢竟, 代碼是寫給人看的. 在無傷大雅的情況下, 按照common的法則來寫, 無疑會讓看代碼的人更快理解.