首頁(yè)常見(jiàn)問(wèn)題正文

Arraylist、Vector和LinkedList有什么區(qū)別?

更新時(shí)間:2023-02-22 來(lái)源:黑馬程序員 瀏覽量:

IT培訓(xùn)班

  Arraylist、Vector和LinkedList類均在java.util包中,均為可伸縮數(shù)組,即可以動(dòng)態(tài)改變長(zhǎng)度的數(shù)組。

  ArrayList和Vector都是基于存儲(chǔ)元素的Object[]array來(lái)實(shí)現(xiàn)的,它們會(huì)在內(nèi)存中開(kāi)辟一塊連續(xù)的空間來(lái)存儲(chǔ),由于數(shù)據(jù)存儲(chǔ)是連續(xù)的,因此,它們支持用序號(hào)(下標(biāo))來(lái)訪問(wèn)元素,同時(shí)索引的數(shù)據(jù)比較快。但是在插入元素時(shí)候需要移動(dòng)容器中的元素,所以對(duì)數(shù)據(jù)的插入操作執(zhí)行得比較慢。ArrayList和Vector都有一個(gè)初始化的容量的大小,當(dāng)里面存儲(chǔ)的元素超過(guò)這個(gè)大小時(shí)就需要?jiǎng)討B(tài)地?cái)U(kuò)充它們的存儲(chǔ)空間。為了提高程序的效率,每次擴(kuò)充容量,不是簡(jiǎn)單地?cái)U(kuò)充一個(gè)存儲(chǔ)單元,而是一次增加多個(gè)存儲(chǔ)單元。Vector默認(rèn)擴(kuò)充為原來(lái)的1.5倍(沒(méi)有提供方法來(lái)設(shè)置空間的擴(kuò)充的方法)。

  ArrayList和Vector最大的區(qū)別就是synchronization(同步)的使用,沒(méi)有一個(gè)ArrayList的方法是同步的,而Vector的絕大多數(shù)方法(例如add、insert、remove、set、equals、hashcode等)都是直接或者間接同步的,所以Vector是線程安全的,ArrayList不是線程安全的。正是由于Vector提供了線程安全的機(jī)制,其性能上也要略遜于ArrayList。

  LinkedList是采用雙向列表來(lái)實(shí)現(xiàn)的,對(duì)數(shù)據(jù)的索引需要從列表頭開(kāi)始遍歷,因此用于隨機(jī)訪問(wèn)則效率比較低,但是插入元素時(shí)不需要對(duì)數(shù)據(jù)進(jìn)行移動(dòng),因此插入效率比較高。同時(shí),LinkedList是非線程安全的容器。

  那么,在實(shí)際使用時(shí)候,如何從這幾種容器中選擇合適的使用呢?當(dāng)對(duì)數(shù)據(jù)的主要操作或者索引只在集合的末端增加、刪除元素時(shí),使用ArrayList或Vector效率比較高;當(dāng)對(duì)數(shù)據(jù)的操作主要為指定位置的插入或刪除操作時(shí),使用LinkedList效率比較高;當(dāng)在線程中使用容器時(shí)(即多個(gè)線程會(huì)同時(shí)訪問(wèn)該容器),選用Vector比較為安全。

下面是黑馬程序員公開(kāi)的幾套Java課程,您可以下載和在線觀看學(xué)習(xí),如果想深入學(xué)習(xí)java并想找到不錯(cuò)的java開(kāi)發(fā)相關(guān)工作,建議報(bào)班學(xué)習(xí)黑馬程序員Java高級(jí)軟件工程師課程。獲取【Java視頻教程+資料】加播妞1605146928606_課程資料.jpg:2217622915。


分享到:
在線咨詢 我要報(bào)名
和我們?cè)诰€交談!