Java中Vector、ArrayList、LinkedList的關(guān)系詳細解析
(一)List實現(xiàn)類關(guān)系

List與Set關(guān)鍵點:
(1)Vector和ArrayList底層均為Object數(shù)組,LinkedList底層是Node節(jié)點。
(2)Vector是線程安全(底層方法均添加synchronized),ArrayList、LinkedList是線程不安全(無鎖)。
(3)Vector默認值10,擴容機制為構(gòu)造函數(shù)設(shè)置自動擴容大小或者默認翻倍;ArrayList默認值為10,擴容機制為1.5倍,采用舊數(shù)組大小+舊數(shù)組大小右移1位;LinkedList無擴容機制,原因為底層存儲為Node節(jié)點。
(4)Vector無參構(gòu)造函數(shù)直接使用默認值10進行初始化,ArrayList無參構(gòu)造函數(shù)未初始化,第一次add的時候進行初始化。
(5)Vector可以指定每次擴容大小,ArrayList不能指定每次擴容大小,固定為1.5倍。
(二)List實現(xiàn)類的使用場景
(1)Vector是線程安全,因底層方法添加了synchronized,導(dǎo)致多線程會阻塞,性能較低;
(2)ArrayList用于大量查詢和修改,因底層是數(shù)組,便于查詢和修改值。(線程不安全,單線程)
(3)LinkedList用于添加和刪除,因底層是鏈表,便于插入值和刪除值。(線程不安全,單線程)
(三)List線程安全操作類
(1)Collections.synchronizedList方法是將底層操作均封裝了并添加了synchronized;
(2)CopyOnWriteArrayList是采用ReentrantLock實現(xiàn)線程安全,讀寫分離,寫時復(fù)制;
優(yōu)缺點:
(1)Collections.synchronizedList(synchronized關(guān)鍵字實現(xiàn))寫數(shù)據(jù)性能上優(yōu)于CopyOnWriterArrayList;
(2)CopyOnWriteArrayList(ReentrantLock實現(xiàn)讀寫分離,寫時復(fù)制)在讀性能上優(yōu)于Collections.synchronizedList;
讀寫分離、寫時復(fù)制原理:
//寫操作:add、remove、set等都是寫操作,這里僅列舉add方法
public boolean add(E e) {
final ReentrantLock lock = this.lock;
lock.lock();//加鎖
try {
Object[] elements = getArray();//獲取原數(shù)組
int len = elements.length;
Object[] newElements = Arrays.copyOf(elements, len + 1);//將原數(shù)組復(fù)制到新數(shù)組
newElements[len] = e;
setArray(newElements);//將新數(shù)組重新賦值到原數(shù)組
return true;
} finally {
lock.unlock();
}
}
//讀操作://因為讀操作不影響數(shù)據(jù),不需要加鎖
//根據(jù)索引查找
public E get(int index) {
return get(getArray(), index);//調(diào)用封裝的get
}
private E get(Object[] a, int index) {
return (E) a[index];//直接返回數(shù)據(jù)
}
到此這篇關(guān)于Java中Vector、ArrayList、LinkedList的關(guān)系詳細解析的文章就介紹到這了,更多相關(guān)Vector、ArrayList、LinkedList的關(guān)系內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
如何基于spring security實現(xiàn)在線用戶統(tǒng)計
這篇文章主要介紹了如何基于spring security實現(xiàn)在線用戶統(tǒng)計,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-06-06
Java中String和StringBuffer及StringBuilder?有什么區(qū)別
這篇文章主要介紹了Java中String和StringBuffer及StringBuilder?有什么區(qū)別,String?是?Java?語言非?;A(chǔ)和重要的類,更多相關(guān)內(nèi)容需要的小伙伴可以參考下面文章內(nèi)容2022-06-06
Redis使用RedisTemplate模板類的常用操作方式
這篇文章主要介紹了Redis使用RedisTemplate模板類的常用操作方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-09-09
SpringBoot配置連接兩個或多個數(shù)據(jù)庫的實現(xiàn)
本文主要介紹了SpringBoot配置連接兩個或多個數(shù)據(jù)庫的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-05-05
java搭建一個Socket服務(wù)器響應(yīng)多用戶訪問
本篇文章主要介紹了java搭建一個Socket服務(wù)器響應(yīng)多用戶訪問,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-02-02

