須要使用到動態數組的時候用的最多的就是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,若是傳入的是同一個數組實際是對同一個數組進行操做
總的來講就是封裝了數組,讓咱們用起來方便一些沒什麼,溜了