一直以來,ArrayList和LinkedList的區別,ArrayList和Vector的區別,List下不同實現類的相關知識點都是Java程序猿在開發過程中必須要掌握的基礎知識,也是在面試過程中最常見的問題之一。
在這裡,本文會將這些知識點加以整理,提取出最精華,最容易使用到的部分給大家,方便記憶。
List
List是一個繼承於Collection的接口,ArrayList,LinkedList,Vector,Stack都只是它的一個實現類。
ArrayList
一個動態數組,由數組實現,所以具有數組的優缺點。方便快速隨機訪問,不適合頻繁的添加或刪除元素。
默認數組大小10。
擴容:底層採用線性連續空間存放元素,當空間不夠時,會重新申請一片新的空間,大小是
原來的1.5倍+1,並把原有的內容複製過去。線程安全性:非線程安全
序列化:支持序列化,實現了java.io.Serializable接口
應用場景(以下兩個條件同時滿足)
需要快速隨機訪問元素
單線程場景或者多線程場景但是List只會被單線程操作
LinkedList
一個雙向鏈表,具有鏈表的一些性質。包括能夠快速添加和刪除元素,但是不適合頻繁訪問元素,因為要從頭指針開始遍歷查找。
查找時,會根據index下標和整個List的長度size的關係,決定是從頭查找還是從尾開始。如果index<size>
默認初始大小0。
擴容:底層實現是鏈表,不存在擴容問題。
線程安全性:非線程安全
應用場景:適用於需要快速插入和刪除元素的場景
Vector
和ArrayList一樣,都是由動態數組實現。方便快速隨機訪問,不適合頻繁的添加或刪除元素。
默認數組大小10。
擴容:與指定的增長係數有關,如果增長係數>0,則新的容量增長為原來的容量+增長係數,否則變為原來容量的2倍。
線程安全性:線程安全,函數大多數具有關鍵字synchronized,即都支持同步。
性能較差,因為方法加入了synchronized修飾,當執行的時候,系統會在方法前加一把鎖,方法執行結束之後再釋放掉。加鎖和釋放鎖的過程會造成一定的系統開銷,因此性能上要差許多。
序列化:不支持序列化
應用場景(以下兩個條件同時滿足)
需要快速隨機訪問元素
多線程場景且List會被多個線程操作
Stack
Stack是棧,繼承於Vector。具有先進後出的特點。
對Vector進行擴展,添加了五個方法操作
empty() 檢查棧是否為空
peek() 查看棧頂對象
pop() 移除棧頂對象並返回
push(E item) 壓入棧頂
search(Object o) 查找對象並返回其位置(下標值)
線程安全性:線程安全,由於繼承於Vector,Vector是線程安全,故Stack也是線程安全類。
總結
有關List族群的相關知識點肯定不止以上這些,它的每一個實現類,都具有自己獨特的性質,方便程序猿在不同的場景使用。
本文的內容只是幫助大家把這些實現類中比較重要的一些屬性整理並記錄下來,幫助大家快速記憶。如果大家希望能夠了解更多的相關知識,可以自行上網查閱資料,也可以在文章最後留言,小編會在之後的文章中針對大家的需要整理成文,提供給大家~
/<size>
閱讀更多 程序猿小白醬 的文章