<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    kooyee ‘s blog

    開源軟件, 眾人努力的結(jié)晶, 全人類的共同財(cái)富
    posts - 103, comments - 55, trackbacks - 0, articles - 66
       :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

    [Data Structure] Vector 和 ArrayList的不同

    Posted on 2008-02-09 19:23 kooyee 閱讀(303) 評(píng)論(0)  編輯  收藏 所屬分類: Java
    Vector 和 ArrayList的不同
      
      有的時(shí)候 Vector更好一些;有的時(shí)候ArrayList 更好一些;有的時(shí)候你一個(gè)也不想用。但愿,你不是在期望一個(gè)簡(jiǎn)單明了的答案,因?yàn)榇鸢敢蚰阍谟盟麄冏鍪裁炊āO旅媸且紤]的四個(gè)方面:
      
      
      API
      
      同步-Synchronization
      
      數(shù)據(jù)增長(zhǎng)-Data growth
      
      使用方法-Usage patterns
      
      讓我一個(gè)一個(gè)來解釋吧。
      
      API
      
      在The Java Programming Language (Addison-Wesley, June 2000) 中Ken Arnold, James Gosling, 和 David Holmes 是這樣描述Vector的,它是更ArrayList類似的一個(gè)東西,所以從API的觀點(diǎn)來看,它們倆是很相似的。但是,它們之間還是有些微的差別的。
      
      Synchronization
      
      Vectors是可同步化的,意思就是說,任何操作Vector的內(nèi)容的方法都是線程安全的,相反的,另一方面,ArrayList是不可同步化的,所以也不是線程安全的。如果你知道了這些的話,你就會(huì)發(fā)現(xiàn),Vector的同步會(huì)讓它在性能發(fā)方面有一些小問題。所以,如果你不需要線程安全的話,那么就使用ArrayList吧。為什么要為沒有必要的同步付出代價(jià)呢?
      
      Data growth
      
      實(shí)際上,不管是ArrayList還是Vector,在它們內(nèi)部都是使用一個(gè)Array來保存數(shù)據(jù)的。編程過程中,在使用它們?nèi)魏我粋€(gè)的時(shí)候,你都需要記住這一點(diǎn)。你在往一個(gè)ArrayList或者Vector里插入一個(gè)元素的時(shí)候,如果內(nèi)部數(shù)組空間不夠了,這個(gè)對(duì)象(譯者按:指的是你使用的ArrayList或者Vector)就要擴(kuò)展它的大小。Vector在默認(rèn)情況下是產(chǎn)生一個(gè)雙倍大小,而ArrayList增加50%的大小。只要你合理的使用這些類,你就可以結(jié)束你在增加新的元素的時(shí)候所付出的性能代價(jià)。把對(duì)象(譯者按:指的是你使用的ArrayList或者Vector)的初始化容量指定為你編程過程中所能用到的最大的容量總是最好的辦法。仔細(xì)的指定容量,你可以避免以后改變內(nèi)部Array容量,所要付出的代價(jià)。如果你并不知道到底有多少個(gè)數(shù)據(jù),當(dāng)是你知道數(shù)據(jù)的增長(zhǎng)率,Vector確實(shí)有一點(diǎn)點(diǎn)優(yōu)勢(shì),因?yàn)槟憧梢灾付ㄔ黾又?譯者按,如果沒有猜錯(cuò)的話,作者說的方法應(yīng)該是setSize(int newSize) Sets the size of this vector.)。
      
      Usage patterns
      
      ArrayList和Vector在從指定位置取得元素,從容器的末尾增加和刪除元素都非常的有效,所有的這些操作都能在一個(gè)常數(shù)級(jí)的時(shí)間(O(1))內(nèi)完成。但是從一個(gè)其他的位置增加和刪除一個(gè)元素就顯得頗為費(fèi)時(shí),差不多需要的時(shí)間為O(n-i),這里的n代表元素個(gè)數(shù),i代表要增加和刪除的元素所在的位置。這些操作需花費(fèi)更多的時(shí)間,因?yàn)槟阈枰€(gè)移動(dòng)i和更高位置的元素。那么,以上這些到底說明了什么呢?
      
      這意味著,如果你取得一個(gè)元素,或者從數(shù)組末尾增加或刪除一個(gè)元素的話,隨便你使用Vector和ArrayList。如果你想要對(duì)數(shù)組內(nèi)容做其他操作的話,那么就為自己好另一個(gè)容器吧。比喻說,LinkedList可以在常數(shù)級(jí)時(shí)間(O(1))內(nèi)為任意一個(gè)位置的元素增加和刪除。但是,取得一個(gè)元素,會(huì)稍微慢一點(diǎn),時(shí)間要用O(i) ,這個(gè)i是元素的位置。通過ArrayList也是很簡(jiǎn)單的,因?yàn)槟憧梢院?jiǎn)單使用一個(gè)索引,而不是構(gòu)造一個(gè)iterator 。LinkedList也為每個(gè)插入的元素建立一個(gè)內(nèi)部對(duì)象。所以,你也必須知道,同時(shí)產(chǎn)生了垃圾對(duì)象。
      
      最后,Practical Java (Addison-Wesley, Feb. 2000) Peter Haggar 里的“實(shí)踐41“建議你使用一個(gè)普通的原始的數(shù)組來代替Vector和ArrayListe,特別是對(duì)效率優(yōu)先的代碼來說。通過使用數(shù)組(array),你可以避免同步,額外的方法調(diào)用,非理想化的大小改變。你付出的只是額外的開發(fā)時(shí)間。
    主站蜘蛛池模板: 亚洲高清国产拍精品熟女| 免费看一级做a爰片久久| 91短视频在线免费观看| 精品无码AV无码免费专区| 亚洲国产一成人久久精品| 亚洲一区二区三区高清视频| 国产精品亚洲lv粉色| 中文字幕在线视频免费观看| 最近中文字幕无免费| 久久亚洲AV成人出白浆无码国产| 中文字幕精品三区无码亚洲 | 精品国产污污免费网站| 嘿嘿嘿视频免费网站在线观看| 日本无卡码免费一区二区三区| 亚洲人成网站在线观看播放| 一本色道久久88—综合亚洲精品 | 亚洲免费视频播放| 国产精品免费久久久久电影网| 精品成在人线AV无码免费看 | 免费三级毛片电影片| 亚洲综合色视频在线观看| 四虎亚洲精品高清在线观看| 大陆一级毛片免费视频观看| 亚洲AV区无码字幕中文色| 鲁啊鲁在线视频免费播放| 亚洲免费福利在线视频| 亚洲七久久之综合七久久| 免费精品国产自产拍在线观看图片| 香蕉大伊亚洲人在线观看| 亚洲午夜精品一级在线播放放 | 免费一级毛片在线播放放视频 | 美女被免费喷白浆视频| 丰满亚洲大尺度无码无码专线| 久久久久国产亚洲AV麻豆 | 亚洲av色福利天堂| 免费视频专区一国产盗摄| 午夜成人无码福利免费视频| 暖暖在线日本免费中文| 丁香花在线观看免费观看图片| 亚洲午夜精品在线| 国产成人精品亚洲精品|