您好,登錄后才能下訂單哦!
這篇文章將為大家詳細講解有關Java中集合底層原理分析,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。
Collection接口是單列集合類的父接口,這種集合可以將數據一個一個的存放到集合中。它有兩個重要的子接口,分別是 java.util.List 和 java.util.Set
1、特點
List是一種有序的集合
List是一種帶索引的集合
List是一種可以存放重復數據的集合
2、List接口三個主要實現類
3、【面試題】ArrayList、LinkedList、Vector的區別
①ArrayList:線程不安全,查詢效率高,插入、刪除效率低;底層使用數組存儲;
②LinkedList:對于頻繁的插入、刪除操作效率比ArrayList高,但是查詢效率低;底層使用雙向鏈表;
③Vector:線程安全,查詢效率高,插入、刪除效率低;底層使用數組存儲;
源碼分析:ArrayList
jdk7
創建對象時底層會創建一個長度為10的數組,默認情況下,擴容為原來的1.5倍,同時將數組復制到新數組中。
jkd8
創建對象時底層不會創建長度為10的數組,而是等到有數據添加進來時才創建。(節約空間,提高效率)
Vector
jdk7和8中創建對象時,底層都創建了長度為10的數組,擴容為原來的2倍
1、特點
能存儲無序、不可重復的元素。
底層:數組+鏈表
2、無序性
無序性:不等于隨機性。存儲的數據在底層數組中并非照數組索引的順序添加,而是根據數據的哈希值決定的。
3、不可重復性
保證添加的元素照equals()判斷時,不能返回true.即:相同的元素只能添加一個。
1、特點
無序的,不可重復的,由K-V鍵值對組成。
2、HashMap的源碼分析
jdk7
在創建對象之后,底層會創建長度為16的一維數組Entry,當元素個數超過加載因子乘以數組長度時,并且當前添加元素發生了碰撞,就會進行擴容,擴容為原來的2倍,并復制到新數組中
jdk8
在創建對象之后底層沒有創建長度為16的數組;
首次添加元素時才創建長度為16的數組
jkd8中數Node[],jdk7時Entry[](就只有名字不同)
jdk7底層是數組+鏈表;而jdk8中是數組+鏈表+紅黑樹
形成鏈表時,jdk7是新元素指向舊元素;jdk8是舊元素指向新元素(防止高并發造成的死循環)
當鏈表長度大于8并且數組長度大于64時,才會變成紅黑樹(提高查找效率)
3、LinkedHashMap
繼承于HashMap,用于實現LUR算法
4、Hashtable
線程安全的,k-v都不能為空。
創建對象時默認為11,擴容為原來的2倍加1
關于“Java中集合底層原理分析”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。