2009-07-27

java Vector vs ArrayList

Vector ArrayList的不同
  
  有的時候 Vector更好一些;有的時候ArrayList 更好一些;有的時候你一個也不想用。但願,你不是在期望一個簡單明瞭的答案,因為答案因你在用他們做什麼而定。下面是要考慮的四個方面:
  
  API
  
  同步-Synchronization
  

  資料增長-Data growth
  

  使用方法-Usage patterns
  

  讓我一個一個來解釋吧。
  
  API
  
  在The Java Programming Language (Addison-Wesley, June 2000) Ken Arnold, James Gosling, David Holmes 是這樣描述Vector的,它是更ArrayList類似的一個東西,所以從API的觀點來看,它們倆是很相似的。但是,它們之間還是有些微的差別的。
  
  Synchronization
  
  Vectors是可同步化的,意思就是說,任何操作Vector的內容的方法都是線程安全的,相反的,另一方面,ArrayList是不可同步化的,所以也不是線程安全的。如果你知道了這些的話,你就會發現,Vector的同步會讓它在性能發方面有一些小問題。所以,如果你不需要線程安全的話,那麼就使用ArrayList吧。為什麼要為沒有必要的同步付出代價呢?
  
  Data growth
  
   實際上,不管是ArrayList還是Vector,在它們內部都是使用一個Array來保存資料的。編程過程中,在使用它們任何一個的時候,你都需要 記住這一點。你在往一個ArrayList或者Vector�插入一個元素的時候,如果內部陣列空間不夠了,這個物件(譯者按:指的是你使用的 ArrayList或者Vector)就要擴展它的大小。Vector在默認情況下是產生一個雙倍大小,而ArrayList增加50%的大小。只要你合 理的使用這些類,你就可以結束你在增加新的元素的時候所付出的性能代價。把對象(譯者按:指的是你使用的ArrayList或者Vector)的初始化容 量指定為你編程過程中所能用到的最大的容量總是最好的辦法。仔細的指定容量,你可以避免以後改變內部Array容量,所要付出的代價。如果你並不知道到底 有多少個資料,當是你知道資料的增長率,Vector確實有一點點優勢,因為你可以指定增加值(譯者按,如果沒有猜錯的話,作者說的方法應該是 setSize(int newSize) Sets the size of this vector.)
  
  Usage patterns
  
   ArrayListVector在從指定位置取得元素,從容器的末尾增加和刪除元素都非常的有效,所有的這些操作都能在一個常數級的時間(O(1)) 內完成。但是從一個其他的位置增加和刪除一個元素就顯得頗為費時,差不多需要的時間為O(n-i),這�的n代表元素個數,i代表要增加和刪除的元素所在 的位置。這些操作需花費更多的時間,因為你需要挨個移動i和更高位置的元素。那麼,以上這些到底說明了什麼呢?
  
  這意味著,如果你 取得一個元素,或者從陣列末尾增加或刪除一個元素的話,隨便你使用VectorArrayList。如果你想要對陣列內容做其他操作的話,那麼就為自己 好另一個容器吧。比喻說,LinkedList可以在常數級時間(O(1))內為任意一個位置的元素增加和刪除。但是,取得一個元素,會稍微慢一點,時間 要用O(i) ,這個i是元素的位置。通過ArrayList也是很簡單的,因為你可以簡單使用一個索引,而不是構造一個iterator LinkedList也為每個插入的元素建立一個內部物件。所以,你也必須知道,同時產生了垃圾物件。
  
  最後,Practical Java (Addison-Wesley, Feb. 2000) Peter Haggar �的"實踐41"建議你使用一個普通的原始的陣列來代替VectorArrayListe,特別是對效率優先的代碼來說。通過使用陣列(array) 你可以避免同步,額外的方法調用,非理想化的大小改變。你付出的只是額外的開發時間。

0 留言: