Java Vector解析與ArrayList區別


Vector繼承了AbstractList,實現了List, RandomAccess, Cloneable, java.io.Serializable,和ArrayList一致

Vector大致與ArrayList一致,但是有以下幾點區別

1 初始化
默認無參構造方法 Vector會初始化一個長度為10的數組,ArrayList在具體調用時再創建數組。
比較之下,ArrayList延遲化加載更節省空間
2 擴容 (grow())
Vector當增量為0時,擴充為原來大小的2倍,當增量大於0時,擴充為原來大小加增量 ArrayList擴充算法:原來數組大小加原來數組的一半
為什么Vector選擇了較為浪費空間的方式擴容,我相信C++ Vector和Java Vector的該處原理應該一致,https://www.zhihu.com/question/36538542/answer/67929747
3 線程安全
Vector是線程安全的,ArrayList是非線程安全的
Vector的線程安全包括其內部類如迭代器實現類ListItr

其實最大的區別就是線程安全性,當然如果我們想創建一個線程安全的ArrayList,可以調用Collections.synchronizedList(),得到靜態內部類SynchronizedList,利用同步代碼塊處理ArrayList。
這種方式得到的線程安全的ArrayList和Vector有什么區別?很簡單,一是同步代碼塊和同步方法的區別,剩下的是ArrayList和Vector除了線程安全性的其他區別;還有一點不能忽略,前者的迭代器的同步實現需要使用者手動控制

 public ListIterator<E> listIterator() {
            return list.listIterator(); // Must be manually synched by user
        }

這是SynchronizedList的迭代器獲取

不過Collections.synchronizedList()的入參是List類型,可以傳入List的其他實現類如LinkedList


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM