Java中的Vector和ArrayList區(qū)別及比較
Vector 和 ArrayList 比較
有時用Vector更好一點,有時用ArrayList更好一點,不能準確容易的給出答案,因為要視具體情況而定,有四個主要考慮的因素:
1:API
2: 同步(synchronization)
3:數(shù)據(jù)增長(Data growth)
4:使用模式(Usage pattern)
下面分別意義探討:
1:API
在Ken Arnold, James Gosling, and David Holmes 的 Java 程序語言的描述中,Vector和ArrayList是類比設計的,從API 的角度來看,兩個類有很多相似性,但是兩個類也有一些不同。
2:同步(Synchronization)
從同步性的角度考慮 : Vector是同步的,一些訪問Vector的內(nèi)容的方法是線程安全的,而ArrayList是非同步的,訪問ArrayList的內(nèi)容的方法是線程不安全的,因為有這個不同,使用synchronized關(guān)鍵字修飾的,將會在性能上有所下降,因此如果你不需要一個線程安全的集合,使用ArrayList。不用花費不必要的synchronization性能開銷。
3:數(shù)據(jù)增長(Data growth)
從內(nèi)部的數(shù)據(jù)結(jié)構(gòu)來看,ArrayList 和 Vector都是使用 數(shù)組(Array)的模式存放內(nèi)容,你需要在程序設計中小心這個本質(zhì),當在 ArrayList和 Vector中插入數(shù)據(jù)時,如果ArrayList或 Vector的對象存儲超出了對應的空間(即內(nèi)部數(shù)組長度)。對應的ArrayList或 Vector將會擴充它們的內(nèi)部的數(shù)組。 Vector默認擴充內(nèi)部數(shù)組的一倍,就是相當于兩個以前的數(shù)組的大小,而ArrayList僅僅增加50%的大小,根據(jù)你使用哪個類來確定增加一個元素的性能影響,最好的方式就是設置對象的初始化容量為需要的最大容量,這樣能夠避免以后插入元素后的自增長,(自增長會涉及到數(shù)組內(nèi)部元素的復制到新創(chuàng)建的數(shù)組中),如果你不知道數(shù)據(jù)將增長到多大,但是你知道數(shù)據(jù)增長的速率,Vectory能夠擁有輕微的優(yōu)勢,因為你能夠設置增長的值。
至于為什么要把 Vector設置為同步和自增長為自身大小的一倍而ArrayList設置為非同步自增長為自身大小的一半:
八卦一下:設置為同步說明數(shù)據(jù)增長比較激烈,就是增長速率和頻率較大,如果設置為一半,很快數(shù)組又滿了,所以設置為一倍。
而ArrayList相應的 增長速率慢,設置為不同步,不容易出現(xiàn)多線程并發(fā)問題。
八卦只是個人理解,歡迎拍磚。
4:使用模式(usage pattern)
ArrayList和Vector都是比較好的在檢索特定位置 的元素的時候以及在集合的末尾增加和移除元素,所有以上的操作都是在O(1)的線性時間,但是如果增加和移除一些別的位置的元素(非最末尾位置)需要更昂貴的線性時間開銷為O(n-i),n代表了元素的總個數(shù),i代表了插入或移除的索引位置,這些操作代價更大,因為不得不移動索引i后端所有的元素,這意味著什么呢?
這意味著你先查找到索引為以及 i 以后 的元素,然后在數(shù)組的末尾插入和移除該元素。如果你想做插入或刪除,可以考慮一些別的集合類,例如:LinkedList能夠增加或移除一些位置的元素在常量時間O(1)內(nèi),但是索引元素的位置比較慢,需要O(i)的時間開銷,i 是需要的元素的索引,遍歷ArrayList是很容易的,因為你能夠簡單的使用索引代替創(chuàng)建一個迭代器,LinkedList也為每一個插入的元素創(chuàng)建一個內(nèi)部的對象,因此你必須意識到額外的垃圾被創(chuàng)建。
最后聲明:你能夠使用最普通的數(shù)組來代替Vector或者ArrayList,尤其是因為標準代碼的性能,使用數(shù)組能夠避免同步(synchronization),額外的方法調(diào)用,最適度的調(diào)整大小,你僅僅需要花費額外的開發(fā)時間。通過array能夠為您的程序量身定做需要的集合。
相關(guān)文章
詳解eclipse中Maven工程使用Tomcat7以上插件的方法
本篇文章主要介紹了詳解eclipse中Maven工程使用Tomcat7以上插件的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-12-12Spring Boot 3.x 集成 Eureka Server/Cl
隨著SpringBoot 3.x版本的開發(fā)嘗試,本文記錄了在集成Eureka Server/Client時所遇到的問題和解決方案,文中詳細介紹了搭建服務、配置文件和測試步驟,感興趣的朋友跟隨小編一起看看吧2024-09-09idea2020.1最新版永久破解/pycharm也可用(步驟詳解)
這篇文章主要介紹了idea2020.1最新版永久破解/pycharm也可用,本文給大家分享簡單實現(xiàn)步驟,通過圖文并茂的形式給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-04-04Java 日期格式y(tǒng)yyy-MM-dd與YYYY-MM-dd區(qū)別
我們在java中常用的規(guī)范格式為:2023-11-11
yyyy-MM-dd HH:mm:ss:SSS 24小時制或yyyy-MM-dd hh:mm:ss:SSS 12小時制,本文就來介紹一下兩者的區(qū)別,感興趣的可以了解一下Selenium+Tesseract-OCR智能識別驗證碼爬取網(wǎng)頁數(shù)據(jù)的實例
本文主要介紹了Selenium+Tesseract-OCR智能識別驗證碼爬取網(wǎng)頁數(shù)據(jù),文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-09-09