日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

比较ArrayList、LinkedList、Vector

發(fā)布時間:2023/11/27 生活经验 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 比较ArrayList、LinkedList、Vector 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

翻譯人員: 鐵錨
翻譯時間: 2013年12月2日
原文鏈接:?ArrayList vs. LinkedList vs. Vector

1. List概述

List,就如圖名字所示一樣,是元素的有序列表。當(dāng)我們討論List時,將其與Set作對比是一個很好的辦法,Set集合中的元素是無序且唯一的。
下圖是Collection的類繼承圖,從圖中你可以對本文所討論的知識有大致的了解.

圖1

2. ArrayList、LinkedList與Vector的對比
從圖中可以看出,這三者都實現(xiàn)了List?接口.所有使用方式也很相似,主要區(qū)別在于因為實現(xiàn)方式的不同,所以對不同的操作具有不同的效率。
ArrayList?是一個可改變大小的數(shù)組.當(dāng)更多的元素加入到ArrayList中時,其大小將會動態(tài)地增長.內(nèi)部的元素可以直接通過get與set方法進行訪問,因為ArrayList本質(zhì)上就是一個數(shù)組.
LinkedList?是一個雙鏈表,在添加和刪除元素時具有比ArrayList更好的性能.但在get與set方面弱于ArrayList.
當(dāng)然,這些對比都是指數(shù)據(jù)量很大或者操作很頻繁的情況下的對比,如果數(shù)據(jù)和運算量很小,那么對比將失去意義.
Vector?和ArrayList類似,但屬于強同步類。如果你的程序本身是線程安全的(thread-safe,沒有在多個線程之間共享同一個集合/對象),那么使用ArrayList是更好的選擇。
Vector和ArrayList在更多元素添加進來時會請求更大的空間。Vector每次請求其大小的雙倍空間,而ArrayList每次對size增長50%.
?LinkedList?還實現(xiàn)了?Queue?接口,該接口比List提供了更多的方法,包括 offer(),peek(),poll()等.
注意: 默認情況下ArrayList的初始容量非常小,所以如果可以預(yù)估數(shù)據(jù)量的話,分配一個較大的初始值屬于最佳實踐,這樣可以減少調(diào)整大小的開銷。
3. ArrayList示例

[java]?view plaincopy
  1. public?static?void?testArrayList()?{??
  2. ????ArrayList<Integer>?al?=?new?ArrayList<Integer>();??
  3. ????al.add(3);??
  4. ????al.add(2);??????????
  5. ????al.add(1);??
  6. ????al.add(4);??
  7. ????al.add(5);??
  8. ????al.add(6);??
  9. ????al.add(6);??
  10. ??
  11. ??
  12. ????Iterator<Integer>?iter1?=?al.iterator();??
  13. ????while(iter1.hasNext()){??
  14. ????????System.out.println(iter1.next());??
  15. ????}??
  16. }??

4. LinkedList示例

[java]?view plaincopy
  1. public?static?void?testLinkedList()?{??
  2. ????LinkedList<Integer>?ll?=?new?LinkedList<Integer>();??
  3. ????ll.add(3);??
  4. ????ll.add(2);??????????
  5. ????ll.add(1);??
  6. ????ll.add(4);??
  7. ????ll.add(5);??
  8. ????ll.add(6);??
  9. ????ll.add(6);??
  10. ??
  11. ??
  12. ????Iterator<Integer>?iter2?=?ll.iterator();??
  13. ????while(iter2.hasNext()){??
  14. ????????System.out.println(iter2.next());??
  15. ????}??
  16. }??

如上面的例子所示,其使用方式是相似的,實際的區(qū)別在于底層的實現(xiàn)方式以及操作的復(fù)雜性不同.
5. Vector
Vector和ArrayList幾乎是完全相同的,唯一的區(qū)別在于Vector是同步類(synchronized).因此,開銷就比ArrayList要大.正常情況下,大多數(shù)的Java程序員使用ArrayList而不是Vector,因為同步完全可以由程序員自己來控制。
6. ArrayList與LinkedList性能對比
時間復(fù)雜度對比如下:

?ArrayListLinkedList
get()?O(1)?O(n)
add()?O(1)?O(1)?amortized
remove()?O(n)?O(n)

?

?

?



*?表中的 add() 代表 add(E e),而 remove()代表 remove(int index)'

  • ArrayList 對于隨機位置的add/remove,時間復(fù)雜度為 O(n),但是對于列表末尾的添加/刪除操作,時間復(fù)雜度是 O(1).?
  • LinkedList對于隨機位置的add/remove,時間復(fù)雜度為 O(n),但是對于列表 末尾/開頭 的添加/刪除操作,時間復(fù)雜度是 O(1).

我使用下面的代碼來測試他們的性能:

?

[java]?view plaincopy
  1. public?static?void?testPerformance()?{??
  2. ????ArrayList<Integer>?arrayList?=?new?ArrayList<Integer>();??
  3. ????LinkedList<Integer>?linkedList?=?new?LinkedList<Integer>();??
  4. ??
  5. ????int???
  6. ????times?=?10?*?1000;??
  7. ????//?times?=?100?*?1000;??
  8. ????//?times?=?1000?*?1000;??
  9. ????System.out.println("Test?times?=?"?+?times);??
  10. ????System.out.println("-------------------------");??
  11. ????//?ArrayList?add??
  12. ????long?startTime?=?System.nanoTime();??
  13. ??
  14. ????for?(int?i?=?0;?i?<?times;?i++)?{??
  15. ????????arrayList.add(i);??
  16. ????}??
  17. ????long?endTime?=?System.nanoTime();??
  18. ????long?duration?=?endTime?-?startTime;??
  19. ????System.out.println(duration?+?"?<--ArrayList?add");??
  20. ??
  21. ????//?LinkedList?add??
  22. ????startTime?=?System.nanoTime();??
  23. ??
  24. ????for?(int?i?=?0;?i?<?times;?i++)?{??
  25. ????????linkedList.add(i);??
  26. ????}??
  27. ????endTime?=?System.nanoTime();??
  28. ????duration?=?endTime?-?startTime;??
  29. ????System.out.println(duration?+?"?<--LinkedList?add");??
  30. ????System.out.println("-------------------------");??
  31. ????//?ArrayList?get??
  32. ????startTime?=?System.nanoTime();??
  33. ??
  34. ????for?(int?i?=?0;?i?<?times;?i++)?{??
  35. ????????arrayList.get(i);??
  36. ????}??
  37. ????endTime?=?System.nanoTime();??
  38. ????duration?=?endTime?-?startTime;??
  39. ????System.out.println(duration?+?"?<--ArrayList?get");??
  40. ??
  41. ????//?LinkedList?get??
  42. ????startTime?=?System.nanoTime();??
  43. ??
  44. ????for?(int?i?=?0;?i?<?times;?i++)?{??
  45. ????????linkedList.get(i);??
  46. ????}??
  47. ????endTime?=?System.nanoTime();??
  48. ????duration?=?endTime?-?startTime;??
  49. ????System.out.println(duration?+?"?<--LinkedList?get");??
  50. ????System.out.println("-------------------------");??
  51. ??
  52. ????//?ArrayList?remove??
  53. ????startTime?=?System.nanoTime();??
  54. ??
  55. ????for?(int?i?=?times?-?1;?i?>=?0;?i--)?{??
  56. ????????arrayList.remove(i);??
  57. ????}??
  58. ????endTime?=?System.nanoTime();??
  59. ????duration?=?endTime?-?startTime;??
  60. ????System.out.println(duration?+?"?<--ArrayList?remove");??
  61. ??
  62. ????//?LinkedList?remove??
  63. ????startTime?=?System.nanoTime();??
  64. ??
  65. ????for?(int?i?=?times?-?1;?i?>=?0;?i--)?{??
  66. ????????linkedList.remove(i);??
  67. ????}??
  68. ????endTime?=?System.nanoTime();??
  69. ????duration?=?endTime?-?startTime;??
  70. ????System.out.println(duration?+?"?<--LinkedList?remove");??
  71. }??

?

輸出結(jié)果如下:

?

[plain]?view plaincopy
  1. Test?times?=?10000??
  2. -------------------------??
  3. 1469985?<--ArrayList?add??
  4. 3530491?<--LinkedList?add??
  5. -------------------------??
  6. 593678?<--ArrayList?get??
  7. 86914251?<--LinkedList?get??
  8. -------------------------??
  9. 625651?<--ArrayList?remove??
  10. 2164320?<--LinkedList?remove??

?

[java]?view plaincopy
  1. Test?times?=?100000??
  2. -------------------------??
  3. 11480805?<--ArrayList?add??
  4. 26384338?<--LinkedList?add??
  5. -------------------------??
  6. 714072?<--ArrayList?get??
  7. 10040809061?<--LinkedList?get??
  8. -------------------------??
  9. 1203935?<--ArrayList?remove??
  10. 1595905?<--LinkedList?remove??

?

[plain]?view plaincopy
  1. 在?1000*1000次的運行中,很長時間過后,?LinkedList的get日志還沒有打印出來,大概是15分鐘左右,結(jié)果還是沒有出來.??

?

[java]?view plaincopy
  1. Test?times?=?1000000??
  2. -------------------------??
  3. 132632998?<--ArrayList?add??
  4. 322885939?<--LinkedList?add??
  5. -------------------------??
  6. 3690752?<--ArrayList?get??
  7. 1520315361147?<--LinkedList?get??
  8. -------------------------??
  9. 8750043?<--ArrayList?remove??
  10. 13872885?<--LinkedList?remove??


他們性能的差異相當(dāng)明顯,LinkedList在 add和remove 上更快,而在get上更慢(原文是這樣的).

?

譯者注:?譯者的編譯和執(zhí)行環(huán)境是 MyEclipse的JDK6,不論怎么看,都是 ArrayList更勝一籌,所以,該怎么選擇,請根據(jù)自己的實際情況來決定,最好自己做測試,因為數(shù)據(jù)類型不同,JDK版本不同,優(yōu)化不同,就可能有不同的結(jié)果。

根據(jù)時間復(fù)雜度表格,以及測試結(jié)果,我們可以判斷何時該用ArrayList,何時該用LinkedList.

簡單來說,LinkedList更適用于:

    • 沒有大規(guī)模的隨機讀取
    • 大量的增加/刪除操作

轉(zhuǎn)載于:https://www.cnblogs.com/remember-forget/p/5977057.html

總結(jié)

以上是生活随笔為你收集整理的比较ArrayList、LinkedList、Vector的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。