ArrayList原理(一)

須要使用到動態數組的時候用的最多的就是ArrayList了,底層實際上是Object數組,如下demo基於JDK1.8:java

List<Integer> list  = new ArrayList<>();數組

list.add(1);
list.add(3);
list.add(2);
list.add(4);
list.add(7);
list.add(5);
list.add(6);
list.add(2);
list.add(2);
list.add(2);
list.remove(1);函數

普及小知識點3d

length:數組的長度length是數組申請的大小,無論有沒有值例如Object[] a = new Object[10];數組a的length就是10blog

size:是list的概念,表示list有效數組的大小,可能一開始list申請了10個大小的Object數組,而後只add了一個數,這個時候length是10,size是1ci

native:非java語言寫的代碼,dll文件rem

首先看add()函數it

ensureCapacityInternal看數組需不須要增長保證有位置插入新的值,而後將要插入的值添加到數組中去class

 

 點進去ensureCapacityInternal,其實用到了兩個函數ensureExplicitCapacity,calculateCapacity,首先看calculateCapacity容器

 

 看函數的名字也知道計算容器空間就是數組的大小,這裏的思路是數組若是爲{},就在10和minCapacity)直接選個大的數返回,不然返回minCapacity,通過一頓騷操做後獲得一個數值,傳入ensureCapacityInternal函數,就是要生成數組的函數。

而後這裏modCount++,modCount是記錄操做的次數,還有一個expectedModCount,後面若是對比兩個值不同的時候會拋異常(另說)

而後判斷minCapacity最小容器大小是否是比原來的數組的length大,若是大也就是原來的數組裝不下新值了怎麼辦,那就調用grow函數把數組變大

grow函數也很簡單記錄原始數組的長度,而後新建一個數字newCapacity是原始數組長度的1.5倍(oldCapacity >> 1右移一位就是除以二),若是newCapacity比傳入的minCapacity,就等於minCapacity,若是比MAX_ARRAY_SIZE大(能夠理解爲很大),就給它一個很大的數組空間,而後調用Arrays.copyOf()函數生成新的數組,通俗的講就是若是你要grow數組的大小,能夠我默認就給你增長到原來的1.5倍,什麼你告訴我minCapacity比原來的1.5倍還要大,好那聽你的用minCapacity,什麼你須要申請的數組大小很大很大就給你一個huge的數組,而後咱們調用Arrays.copyOf實際生成須要的數組,而後看copyOf()函數

點進去繼續看return的copyOf函數

 

 

 這個函數也很簡單,就是新建一個copy數組其實就是咱們要生成的數組,若是newType是Object類型就新建一個Object的數組,長度是newLength(這裏的newType其實就是original.class,就是原始數組的類型的class,newLength就是但願建立的數組的大小),若是原始數組不是Object的就調用Array.newInstance方法生成數組實例,點進去

繼續點擊進去newArray方法

其實調用的就是底層的native方法,native方法就是否是java語言寫的方法,例如可能你調用的是dll文件,就是說你不是Object可能就是其餘語言支持的一些類型了

而後繼續日後看System.arraycopy

System.arraycopy(original, 0, copy, 0,Math.min(original.length, newLength));

點進去

其實就是一個native方法

src - 源數組。
srcPos - 源數組中的起始位置。
dest - 目標數組。
destPos - 目標數據中的起始位置。
length - 要複製的數組元素的數量。

直接調用System.arraycopy的話,這裏copy的時候若是是兩個不一樣數組還好就是copy,若是傳入的是同一個數組實際是對同一個數組進行操做

總的來講就是封裝了數組,讓咱們用起來方便一些沒什麼,溜了

相關文章
相關標籤/搜索