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!

推薦閱讀: