Java基礎學習之集合底層原理
一、Collection集合
Collection接口是單列集合類的父接口,這種集合可以將數據一個一個的存放到集合中。它有兩個重要的子接口,分別是 java.util.List 和 java.util.Set
二、List接口
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倍
三、Set(Set底層是由Map實現的,所以一般都是問Map)
1、特點
能存儲無序、不可重復的元素。
底層:數組+鏈表
2、無序性
無序性:不等於隨機性。存儲的數據在底層數組中並非照數組索引的順序添加,而是根據數據的哈希值決定的。
3、不可重復性
保證添加的元素照equals()判斷時,不能返回true.即:相同的元素隻能添加一個。
四、Map
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基礎學習之集合底層原理的文章就介紹到這瞭,更多相關Java集合底層原理內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- Java和Scala集合間的相互轉換方式
- Java十分鐘精通集合的使用與原理上篇
- Java Collection集合用法詳解
- 深入解讀Java三大集合之map list set的用法
- Java集合框架之Map詳解