面試知識點--Vector和ArrayList的比較

Vector和ArrayList也是面試過程經常提問到的java基礎知識,但是我們很多人容易忽略它們,這裏總結一下他們的相同和不同,希望能提高和豐富一下我們的基礎知識。

Vector和ArrayList都是基於儲存元素的Object[] array數組來實現的,是根據索引來訪問元素的。
以下從相同點和不同點進行討論。

一、相同點

先說一下他們在查詢,插入,刪除對象的效率問題。ArrayList和Vector在從指定位置取得元素,從容器的末尾增加和刪除元素都非常的有效,所有的這些操作都能在一個常數級的時間O(1)內完成,因爲它們都是用數組實現的,我們知道數組在定位元素位置時非常的快,通過索引直接可以查到對應的元素位置。但是要在某個位置增加和刪除一個元素時就顯得頗爲耗時,差不多需要的時間爲O(n-i),這裏的n代表元素個數,i代表要增加和刪除的元素所在的位置。這些操作需花費更多的時間,因爲你需要挨個移動i和更高位置的元素。
這意味着,如果你取得一個元素,或者從數組末尾增加或刪除一個元素的話,隨便你使用Vector或ArrayList,它們在效率上市相同的。如果你想要對數組內容做其它操作的話,如插入元素,那麼最好選擇另外的容器。比如LinkedList,LinkedList可以在常數級時間(O1)內爲任意一個位置的元素增加和刪除,因爲它是由鏈表實現的,對於插入元素非常的快,因爲只需要改變一下指針指向即可,但它也有別的問題,就是查詢元素會比較慢,因爲它要依次輪詢指針的指向,這時相對於ArrayList和Vector就要慢很多。

二、不同點

ArrayList與Vector的最大區別,主要包括兩個方面:.

1、同步性(synchronization):

Vector是線程安全的,也就是說是它的方法之間是線程同步的,而ArrayList是線程序不安全的,它的方法之間是線程不同步的。如果只有一個線程會訪問到集合,那最好是使用ArrayList,因爲它不考慮線程安全,效率會高些;如果有多個線程會訪問到集合,那最好是使用Vector,因爲不需要我們自己再去考慮和編寫線程安全的代碼。

備註:對於Vector&ArrayList、Hashtable&HashMap,要記住線程安全的問題,記住Vector與Hashtable是舊的,是java一誕生就提供了的,它們是線程安全的,ArrayList與HashMap是java2時才提供的,它們是線程不安全的。
所以基於以上,常用的還是ArrayList,只有在線程安全時纔會去使用Vector。

2、數據增長:

ArrayList與Vector都有一個初始的容量大小,當存儲進它們裏面的元素的個數超過了容量時,就需要增加ArrayList與Vector的存儲空間,每次要增加存儲空間時,不是隻增加一個存儲單元,而是增加多個存儲單元,每次增加的存儲單元的個數在內存空間利用與程序效率之間要取得一定的平衡。
Vector默認增長爲原來兩倍,而ArrayList的增長策略在文檔中沒有明確規定(從源代碼看到的是增長爲原來的1.5倍)。
ArrayList與Vector都可以設置初始的空間大小,Vector還可以設置增長的空間大小,而ArrayList沒有提供設置增長空間的方法。

總結:增加存儲單元時,Vector一次增長原來的一倍,ArrayList增加原來的0.5倍。

參考:

http://blog.sina.com.cn/s/blog_8f99a1640101ohst.html
http://www.jobui.com/mianshiti/it/java/8149/

對以上博文的作者表示感謝。
這裏寫圖片描述
歡迎您掃一掃上面的微信公衆號,訂閱我的個人公衆號!
本公衆號將以推送Android各種碎片化小知識或小技巧,以及整理Android面試知識點爲主,也會不定期將開發老司機日常工作中踩過的坑,平時自學的一些知識總結出來進行分享。每天一點乾貨小知識把你的碎片時間充分利用起來。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章