ArrayList原理(一)

來源:互聯網
上載者:User

需要使用到動態數組的時候用的最多的就是ArrayList了,底層其實是Object數組,以下demo基於JDK1.8:

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);

普及小知識點

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

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

native:非java語言寫的代碼,dll檔案

首先看add()函數

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

 

 點進去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,如果傳入的是同一個數組實際是對同一個數組進行操作

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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.