【Java面試題】32 ArrayList和Vector的區別

 

1. Vector & ArrayList 編程

相同點:數組

一、ArrayList和Vector都是繼承了相同的父類和實現了相同的接口安全

二、底層都是數組實現的多線程

三、初始默認長度都爲10。框架

不一樣點:
1)  Vector的方法都是同步的(Synchronized),是線程安全的(thread-safe),而ArrayList的方法不是,因爲線程的同步必然要影響性能,所以,ArrayList的性能比Vector好。 
2) 當Vector或ArrayList中的元素超過它的初始大小時,Vector會將它的容量翻倍,而ArrayList只增長50%的大小,這樣,ArrayList就有利於節約內存空間。性能

或者這麼說:spa

一、Vector是多線程安全的,而ArrayList不是,這個能夠從源碼中看出,Vector類中的方法不少有synchronized進行修飾,這樣就致使了Vector在效率上沒法與ArrayList相比;線程

二、兩個都是採用的線性連續空間存儲元素,可是當空間不足的時候,兩個類的增長方式是不一樣的,不少網友說Vector增長原來空間的一倍,ArrayList增長原來空間的50%,其實也差很少是這個意思,不過還有一點點問題能夠從源碼中看出,一下子從源碼中分析。對象

三、Vector能夠設置增加因子,而ArrayList不能夠,最開始看這個的時候,我沒理解什麼是增量因子,不過經過對比一下兩個源碼理解了這個,先看看兩個類的構造方法:繼承

或者能夠這麼說:

首先看這兩類都實現List接口,而List接口一共有三個實現類,分別是ArrayList、Vector和LinkedList。List用於存放多個元素,可以維護元素的次序,而且容許元素的重複。3個具體實現類的相關區別以下:

  1. ArrayList是最經常使用的List實現類,內部是經過數組實現的,它容許對元素進行快速隨機訪問。數組的缺點是每一個元素之間不能有間隔,當數組大小不知足時須要增長存儲能力,就要講已經有數組的數據複製到新的存儲空間中。當從ArrayList的中間位置插入或者刪除元素時,須要對數組進行復制、移動、代價比較高。所以,它適合隨機查找和遍歷,不適合插入和刪除。
  2. Vector與ArrayList同樣,也是經過數組實現的,不一樣的是它支持線程的同步,即某一時刻只有一個線程可以寫Vector,避免多線程同時寫而引發的不一致性,但實現同步須要很高的花費,所以,訪問它比訪問ArrayList慢。
  3. LinkedList是用鏈表結構存儲數據的,很適合數據的動態插入和刪除,隨機訪問和遍歷速度比較慢。另外,他還提供了List接口中沒有定義的方法,專門用於操做表頭和表尾元素,能夠看成堆棧、隊列和雙向隊列使用。

     查看Java源代碼,發現當數組的大小不夠的時候,須要從新創建數組,而後將元素拷貝到新的數組內,ArrayList和Vector的擴展數組的大小不一樣。

2. Hashtable & HashMap 
Hashtable和HashMap它們的性能方面的比較相似 Vector和ArrayList,好比Hashtable的方法是同步的,而HashMap的不是。


3. ArrayList & LinkedList

ArrayList的內部實現是基於內部數組Object[],因此從概念上講,它更象數組,但LinkedList的內部實現是基於一組鏈接的記錄,因此,它更象一個鏈表結構,因此,它們在性能上有很大的差異: 
       從上面的分析可知,在ArrayList的前面或中間插入數據時,你必須將其後的全部數據相應的後移,這樣必然要花費較多時間,因此,當你的操做是在一列數據的後面添加數據而不是在前面或中間,而且須要隨機地訪問其中的元素時,使用ArrayList會提供比較好的性能; 而訪問鏈表中的某個元素時,就必須從鏈表的一端開始沿着鏈接方向一個一個元素地去查找,直到找到所需的元素爲止,因此,當你的操做是在一列數據的前面或中間添加或刪除數據,而且按照順序訪問其中的元素時,就應該使用LinkedList了。 
 

若是在編程中,一、2兩種情形交替出現,這時,你能夠考慮使用List這樣的通用接口,而不用關心具體的實現,在具體的情形下,它的性能由具體的實現來保證。


4. 配置集合類的初始大小     在Java集合框架中的大部分類的大小是能夠隨着元素個數的增長而相應的增長的,咱們彷佛不用關心它的初始大小,但若是咱們考慮類的性能問題時,就必定要考慮儘量地設置好集合對象的初始大小,這將大大提升代碼的性能。     好比,Hashtable缺省的初始大小爲101,載入因子爲0.75,即若是其中的元素個數超過75個,它就必須增長大小並從新組織元素,因此,若是你知道在建立一個新的Hashtable對象時就知道元素的確切數目如爲110,那麼,就應將其初始大小設爲110/0.75=148,這樣,就能夠避免從新組織內存並增長大小。

相關文章
相關標籤/搜索