自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Java中的List你真的會(huì)用嗎?

開(kāi)發(fā) 開(kāi)發(fā)工具
List是Java中比較常用的集合類(lèi),關(guān)于List接口有很多實(shí)現(xiàn)類(lèi),本文就來(lái)簡(jiǎn)單介紹下其中幾個(gè)重點(diǎn)的實(shí)現(xiàn)ArrayList、LinkedList和Vector之間的關(guān)系和區(qū)別。

List是Java中比較常用的集合類(lèi),關(guān)于List接口有很多實(shí)現(xiàn)類(lèi),本文就來(lái)簡(jiǎn)單介紹下其中幾個(gè)重點(diǎn)的實(shí)現(xiàn)ArrayList、LinkedList和Vector之間的關(guān)系和區(qū)別。

[[245148]]

List

 

List 是一個(gè)接口,它繼承于Collection的接口。它代表著有序的隊(duì)列。當(dāng)我們討論List的時(shí)候,一般都和Set作比較。

List中元素可以重復(fù),并且是有序的(這里的有序指的是按照放入的順序進(jìn)行存儲(chǔ)。如按照順序把1,2,3存入List,那么,從List中遍歷出來(lái)的順序也是1,2,3)。

Set中的元素不可以重復(fù),并且是無(wú)序的(從set中遍歷出來(lái)的數(shù)據(jù)和放入順序沒(méi)有關(guān)系)。

下面是Java中的集合類(lèi)的關(guān)系圖。從中可以大致了解集合類(lèi)之間的關(guān)系

 

ArrayList、 LinkedList 和 Vector之間的區(qū)別

 

從上圖可以看出,ArrayList、 LinkedList 和 Vector都實(shí)現(xiàn)了List接口,是List的三種實(shí)現(xiàn),所以在用法上非常相似。他們之間的主要區(qū)別體現(xiàn)在不同操作的性能上。后面會(huì)詳細(xì)分析。

ArrayList

ArrayList底層是用數(shù)組實(shí)現(xiàn)的,可以認(rèn)為ArrayList是一個(gè)可改變大小的數(shù)組。隨著越來(lái)越多的元素被添加到ArrayList中,其規(guī)模是動(dòng)態(tài)增加的。

LinkedList

LinkedList底層是通過(guò)雙向鏈表實(shí)現(xiàn)的。所以,LinkedList和ArrayList之前的區(qū)別主要就是數(shù)組和鏈表的區(qū)別。

數(shù)組中查詢(xún)和賦值比較快,因?yàn)榭梢灾苯油ㄟ^(guò)數(shù)組下標(biāo)訪問(wèn)指定位置。

鏈表中刪除和增加比較快,因?yàn)榭梢灾苯油ㄟ^(guò)修改鏈表的指針(Java中并無(wú)指針,這里可以簡(jiǎn)單理解為指針。其實(shí)是通過(guò)Node節(jié)點(diǎn)中的變量指定)進(jìn)行元素的增刪。

所以,LinkedList和ArrayList相比,增刪的速度較快。但是查詢(xún)和修改值的速度較慢。同時(shí),LinkedList還實(shí)現(xiàn)了Queue接口,所以他還提供了offer(), peek(), poll()等方法。

Vector

Vector和ArrayList一樣,都是通過(guò)數(shù)組實(shí)現(xiàn)的,但是Vector是線程安全的。和ArrayList相比,其中的很多方法都通過(guò)同步(synchronized)處理來(lái)保證線程安全。

如果你的程序不涉及到線程安全問(wèn)題,那么使用ArrayList是更好的選擇(因?yàn)閂ector使用synchronized,必然會(huì)影響效率)。

二者之間還有一個(gè)區(qū)別,就是擴(kuò)容策略不一樣。在List被***次創(chuàng)建的時(shí)候,會(huì)有一個(gè)初始大小,隨著不斷向List中增加元素,當(dāng)List認(rèn)為容量不夠的時(shí)候就會(huì)進(jìn)行擴(kuò)容。Vector缺省情況下自動(dòng)增長(zhǎng)原來(lái)一倍的數(shù)組長(zhǎng)度,ArrayList增長(zhǎng)原來(lái)的50%。

 

ArrayList 和 LinkedList的性能對(duì)比

 

使用以下代碼對(duì)ArrayList和LinkedList中的幾種主要操作所用時(shí)間進(jìn)行對(duì)比:

  1. ArrayList<Integer> arrayList = new ArrayList<Integer>(); 
  2. LinkedList<Integer> linkedList = new LinkedList<Integer>(); 
  3.  
  4. // ArrayList add 
  5. long startTime = System.nanoTime(); 
  6.  
  7. for (int i = 0; i < 100000; i++) { 
  8.     arrayList.add(i); 
  9. long endTime = System.nanoTime(); 
  10. long duration = endTime - startTime; 
  11. System.out.println("ArrayList add:  " + duration); 
  12.  
  13. // LinkedList add 
  14. startTime = System.nanoTime(); 
  15.  
  16. for (int i = 0; i < 100000; i++) { 
  17.     linkedList.add(i); 
  18. endTime = System.nanoTime(); 
  19. duration = endTime - startTime; 
  20. System.out.println("LinkedList add: " + duration); 
  21.  
  22. // ArrayList get 
  23. startTime = System.nanoTime(); 
  24.  
  25. for (int i = 0; i < 10000; i++) { 
  26.     arrayList.get(i); 
  27. endTime = System.nanoTime(); 
  28. duration = endTime - startTime; 
  29. System.out.println("ArrayList get:  " + duration); 
  30.  
  31. // LinkedList get 
  32. startTime = System.nanoTime(); 
  33.  
  34. for (int i = 0; i < 10000; i++) { 
  35.     linkedList.get(i); 
  36. endTime = System.nanoTime(); 
  37. duration = endTime - startTime; 
  38. System.out.println("LinkedList get: " + duration); 
  39.  
  40.  
  41.  
  42. // ArrayList remove 
  43. startTime = System.nanoTime(); 
  44.  
  45. for (int i = 9999; i >=0; i--) { 
  46.     arrayList.remove(i); 
  47. endTime = System.nanoTime(); 
  48. duration = endTime - startTime; 
  49. System.out.println("ArrayList remove:  " + duration); 
  50.  
  51.  
  52.  
  53. // LinkedList remove 
  54. startTime = System.nanoTime(); 
  55.  
  56. for (int i = 9999; i >=0; i--) { 
  57.     linkedList.remove(i); 
  58. endTime = System.nanoTime(); 
  59. duration = endTime - startTime; 
  60. System.out.println("LinkedList remove: " + duration); 

結(jié)果:

  1. ArrayList add:  13265642 
  2. LinkedList add: 9550057 
  3. ArrayList get:  1543352 
  4. LinkedList get: 85085551 
  5. ArrayList remove:  199961301 
  6. LinkedList remove: 85768810 

 

 

他們的表現(xiàn)的差異是顯而易見(jiàn)的。在添加和刪除操作上LinkedList更快,但在查詢(xún)速度較慢。

 

如何選擇

 

如果涉及到多線程,那么就選擇Vector(當(dāng)然,你也可以使用ArrayList并自己實(shí)現(xiàn)同步)。

 

如果不涉及到多線程就從LinkedList、ArrayList中選。 LinkedList更適合從中間插入或者刪除(鏈表的特性)。 ArrayList更適合檢索和在末尾插入或刪除(數(shù)組的特性)。

【本文是51CTO專(zhuān)欄作者Hollis的原創(chuàng)文章,作者微信公眾號(hào)Hollis(ID:hollischuang)】

戳這里,看該作者更多好文

責(zé)任編輯:武曉燕 來(lái)源: 51CTO專(zhuān)欄
相關(guān)推薦

2020-06-04 14:15:55

Java中BigDecimal函數(shù)

2023-12-01 11:13:50

JavaTreeSet

2016-05-04 10:36:42

iossdwebimage開(kāi)發(fā)

2025-01-20 00:00:00

反射Java語(yǔ)言

2022-09-22 14:55:31

前端JavaScripthis

2022-09-26 13:10:17

JavaScriptthis

2025-04-01 08:00:00

curl開(kāi)發(fā)運(yùn)維

2018-12-21 11:24:55

Java時(shí)間處理編程語(yǔ)言

2021-11-26 08:07:16

MySQL SQL 語(yǔ)句數(shù)據(jù)庫(kù)

2020-12-18 08:59:51

蘋(píng)果iCloud儲(chǔ)存照片

2024-12-27 09:29:09

2025-02-14 08:30:49

SpringJava開(kāi)發(fā)

2019-07-25 12:46:32

Java高并發(fā)編程語(yǔ)言

2023-11-01 13:48:00

反射java

2021-09-08 07:49:35

Dubbo連接控制

2023-04-28 07:49:13

Javawaitsleep

2018-04-27 15:30:53

Java三目運(yùn)算符

2021-05-21 12:36:16

限流代碼Java

2024-03-06 08:15:03

@Autowired注入方式Spring

2022-01-17 07:32:34

Java參數(shù)方法
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)