Java中Vector、ArrayList、LinkedList的關(guān)系詳細(xì)解析
(一)List實(shí)現(xiàn)類關(guān)系
List與Set關(guān)鍵點(diǎn):
(1)Vector和ArrayList底層均為Object數(shù)組,LinkedList底層是Node節(jié)點(diǎn)。
(2)Vector是線程安全(底層方法均添加synchronized),ArrayList、LinkedList是線程不安全(無鎖)。
(3)Vector默認(rèn)值10,擴(kuò)容機(jī)制為構(gòu)造函數(shù)設(shè)置自動(dòng)擴(kuò)容大小或者默認(rèn)翻倍;ArrayList默認(rèn)值為10,擴(kuò)容機(jī)制為1.5倍,采用舊數(shù)組大小+舊數(shù)組大小右移1位;LinkedList無擴(kuò)容機(jī)制,原因?yàn)榈讓哟鎯?chǔ)為Node節(jié)點(diǎn)。
(4)Vector無參構(gòu)造函數(shù)直接使用默認(rèn)值10進(jìn)行初始化,ArrayList無參構(gòu)造函數(shù)未初始化,第一次add的時(shí)候進(jìn)行初始化。
(5)Vector可以指定每次擴(kuò)容大小,ArrayList不能指定每次擴(kuò)容大小,固定為1.5倍。
(二)List實(shí)現(xiàn)類的使用場景
(1)Vector是線程安全,因底層方法添加了synchronized,導(dǎo)致多線程會(huì)阻塞,性能較低;
(2)ArrayList用于大量查詢和修改,因底層是數(shù)組,便于查詢和修改值。(線程不安全,單線程)
(3)LinkedList用于添加和刪除,因底層是鏈表,便于插入值和刪除值。(線程不安全,單線程)
(三)List線程安全操作類
(1)Collections.synchronizedList方法是將底層操作均封裝了并添加了synchronized;
(2)CopyOnWriteArrayList是采用ReentrantLock實(shí)現(xiàn)線程安全,讀寫分離,寫時(shí)復(fù)制;
優(yōu)缺點(diǎn):
(1)Collections.synchronizedList(synchronized關(guān)鍵字實(shí)現(xiàn))寫數(shù)據(jù)性能上優(yōu)于CopyOnWriterArrayList;
(2)CopyOnWriteArrayList(ReentrantLock實(shí)現(xiàn)讀寫分離,寫時(shí)復(fù)制)在讀性能上優(yōu)于Collections.synchronizedList;
讀寫分離、寫時(shí)復(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(); } } //讀操作://因?yàn)樽x操作不影響數(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];//直接返回?cái)?shù)據(jù) }
到此這篇關(guān)于Java中Vector、ArrayList、LinkedList的關(guān)系詳細(xì)解析的文章就介紹到這了,更多相關(guān)Vector、ArrayList、LinkedList的關(guān)系內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java實(shí)現(xiàn)滑動(dòng)驗(yàn)證碼(前端部分)
這篇文章主要為大家介紹了如何用Java語言實(shí)現(xiàn)滑動(dòng)驗(yàn)證碼的生成(前端部分),文中的示例代碼講解詳細(xì),具有一定的學(xué)習(xí)價(jià)值,感興趣的小伙伴可以跟隨小編學(xué)習(xí)一下2022-10-10Windows7下的Java運(yùn)行環(huán)境搭建過程圖解
這篇文章主要介紹了Windows7下的Java運(yùn)行環(huán)境搭建過程圖解,需要的朋友可以參考下2014-04-04Java HashMap源碼及并發(fā)環(huán)境常見問題解決
這篇文章主要介紹了Java HashMap源碼及并發(fā)環(huán)境常見問題解決,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-09-09mybaits-plus?lambdaQuery()?和?lambdaUpdate()?常見的使用方法
MyBatis-Plus是一個(gè)?MyBatis?(opens?new?window)的增強(qiáng)工具,在?MyBatis?的基礎(chǔ)上只做增強(qiáng)不做改變,為簡化開發(fā)、提高效率而生,這篇文章主要介紹了mybaits-plus?lambdaQuery()?和?lambdaUpdate()?比較常見的使用方法,需要的朋友可以參考下2023-01-01Java如果通過jdbc操作連接oracle數(shù)據(jù)庫
這篇文章主要介紹了Java如果通過jdbc操作連接oracle數(shù)據(jù)庫,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-09-09Java前端開發(fā)之HttpServletRequest的使用
service方法中的request的類型是ServletRequest,而doGet/doPost方法的request的類型是HttpServletRequest,HttpServletRequest是ServletRequest的子接口,功能和方法更加強(qiáng)大2023-01-01springboot項(xiàng)目突然啟動(dòng)緩慢的解決
這篇文章主要介紹了springboot項(xiàng)目突然啟動(dòng)緩慢的解決,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-11-11