Java中Vector、ArrayList、LinkedList的關系詳細解析
(一)List實現(xiàn)類關系
List與Set關鍵點:
(1)Vector和ArrayList底層均為Object數(shù)組,LinkedList底層是Node節(jié)點。
(2)Vector是線程安全(底層方法均添加synchronized),ArrayList、LinkedList是線程不安全(無鎖)。
(3)Vector默認值10,擴容機制為構造函數(shù)設置自動擴容大小或者默認翻倍;ArrayList默認值為10,擴容機制為1.5倍,采用舊數(shù)組大小+舊數(shù)組大小右移1位;LinkedList無擴容機制,原因為底層存儲為Node節(jié)點。
(4)Vector無參構造函數(shù)直接使用默認值10進行初始化,ArrayList無參構造函數(shù)未初始化,第一次add的時候進行初始化。
(5)Vector可以指定每次擴容大小,ArrayList不能指定每次擴容大小,固定為1.5倍。
(二)List實現(xiàn)類的使用場景
(1)Vector是線程安全,因底層方法添加了synchronized,導致多線程會阻塞,性能較低;
(2)ArrayList用于大量查詢和修改,因底層是數(shù)組,便于查詢和修改值。(線程不安全,單線程)
(3)LinkedList用于添加和刪除,因底層是鏈表,便于插入值和刪除值。(線程不安全,單線程)
(三)List線程安全操作類
(1)Collections.synchronizedList方法是將底層操作均封裝了并添加了synchronized;
(2)CopyOnWriteArrayList是采用ReentrantLock實現(xiàn)線程安全,讀寫分離,寫時復制;
優(yōu)缺點:
(1)Collections.synchronizedList(synchronized關鍵字實現(xiàn))寫數(shù)據(jù)性能上優(yōu)于CopyOnWriterArrayList;
(2)CopyOnWriteArrayList(ReentrantLock實現(xiàn)讀寫分離,寫時復制)在讀性能上優(yōu)于Collections.synchronizedList;
讀寫分離、寫時復制原理:
//寫操作: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ù)組復制到新數(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);//調用封裝的get } private E get(Object[] a, int index) { return (E) a[index];//直接返回數(shù)據(jù) }
到此這篇關于Java中Vector、ArrayList、LinkedList的關系詳細解析的文章就介紹到這了,更多相關Vector、ArrayList、LinkedList的關系內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Windows7下的Java運行環(huán)境搭建過程圖解
這篇文章主要介紹了Windows7下的Java運行環(huán)境搭建過程圖解,需要的朋友可以參考下2014-04-04Java HashMap源碼及并發(fā)環(huán)境常見問題解決
這篇文章主要介紹了Java HashMap源碼及并發(fā)環(huán)境常見問題解決,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2020-09-09mybaits-plus?lambdaQuery()?和?lambdaUpdate()?常見的使用方法
MyBatis-Plus是一個?MyBatis?(opens?new?window)的增強工具,在?MyBatis?的基礎上只做增強不做改變,為簡化開發(fā)、提高效率而生,這篇文章主要介紹了mybaits-plus?lambdaQuery()?和?lambdaUpdate()?比較常見的使用方法,需要的朋友可以參考下2023-01-01Java如果通過jdbc操作連接oracle數(shù)據(jù)庫
這篇文章主要介紹了Java如果通過jdbc操作連接oracle數(shù)據(jù)庫,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2020-09-09Java前端開發(fā)之HttpServletRequest的使用
service方法中的request的類型是ServletRequest,而doGet/doPost方法的request的類型是HttpServletRequest,HttpServletRequest是ServletRequest的子接口,功能和方法更加強大2023-01-01