arrayList和vector的區別

 

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

 

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

    6. 若是查找一個指定位置的數據,vector和arraylist使用的時間是相同的,都是0(1),這個時候使用vector和arraylist均可以。而
      若是移動一個指定位置的數據花費的時間爲0(n-i)n爲總長度,這個時候就應該考慮到使用Linkedlist,由於它移動一個指定位置的數據
      所花費的時間爲0(1),而查詢一個指定位置的數據時花費的時間爲0(i)。
      ArrayList 和Vector是採用數組方式存儲數據,此數組元素數大於實際存儲的數據以便增長和插入元素,
      都容許直接序號索引元素,可是插入數據要設計到數組元素移動 等內存操做,因此索引數據快插入數據慢,
      Vector因爲使用了synchronized方法(線程安全)因此性能上比ArrayList要差
      ,LinkedList使用雙向鏈表實現存儲,按序號索引數據須要進行向前或向後遍歷,可是插入數據時只須要記錄本項的先後項便可,因此插入數度較快!數組

    7. 籠統來講:LinkedList:增刪改快
                    ArrayList:查詢快(有索引的存在)安全

 

 

 

 

 

1. Vector & ArrayList 

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

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


3. ArrayList & LinkedListless

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

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


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

 

 

 

 

轉自:the following is from:http://blessed24.javaeye.com/blog/751336

相關文章
相關標籤/搜索