1. 程式人生 > >ArrayList擴容機制

ArrayList擴容機制

上一篇文章介紹了ArrayList和LinkedList的區別。其中將ArrayList的add()方法中的擴容跳過。現在結合原始碼(給予jdk1.8)詳細講一下ArrayList的擴容機制

首先  ArrayList的預設長度應該大家都很瞭解是10

在呼叫有參的構造方法時也是可以指定初始長度

add()方法中其實有兩個步驟我們主要看第一步其中就包括擴容的部分

ensureCpacityInternal(int size)這個方法中還是有兩個步驟

elementData就是我們維護的陣列物件 minCapacity就是我們傳入的陣列所需的最小長度

calculateCapacity這個方法中是得到陣列的最小長度

Math.max就是得到兩個引數中大的一個返回

我們再來看看得到List的長度之後的ensureExplicitCapacity操作

這裡面第一步修改次數+1

第二步將陣列所需最小長度和維護的陣列長度進行比較如果最小長度大於已有長度則呼叫grow擴容方法

oldCapacity是已有陣列長度

這裡面首先先得到一個newCapacity通過  就陣列長度+(舊長度/2)   >>就是右移運算   num >> 1  =   num/2

也就是newCapacity是舊長度的1.5倍拿出手中的筆劃重點

情況一:將new長度和最小需要長度比較 如果new小則將min長度賦值給new   這個時候擴容長度不確定

情況二:將new長度和陣列允許最大長度比較 如果超過則呼叫hugeCapacity  這個時候陣列最大長度只能限制在Integer的最大值2的31次方減一

情況三:也就是一般情況 就是1.5倍擴容

最後一個步驟就是賦值陣列了

綜上得到:在正常情況下ArrayList的擴容機制是 在不設定初始長度時長度10當第11個元素要放入時陣列會建立一個長度為舊長度1.5倍的陣列然後將就陣列資料複製過去

注:其實我們平時呼叫的size()是陣列中元素的個數和長度的關係是小於等於

本人個人QQ/wechat : 806751350