ArrayList是一個支持隨機訪問的動態(tài)數(shù)組巍扛,當執(zhí)行add()方法時,它的底層發(fā)生了很多判斷機制腹侣,數(shù)組大小不夠怎么辦叔收?什么時候擴容?我們來深挖一下它的底層源碼傲隶。
我們可以看到當執(zhí)行add()方法時饺律,首先會調用ensureCapacityInternal()這個方法,來保證容量足夠跺株,之后再將新添加的元素e放到新擴充容量的位置复濒。我們再來細看ensureCapacityInternal()這個方法
ensureCapacityInternal()上面?zhèn)魅氲膮?shù)是size+1,size是當前數(shù)組的元素個數(shù)大小乒省。方法進來以后巧颈,先判斷當前數(shù)組是否為空數(shù)組,DEFAULTCAPACITY_EMPTY_ELEMENTDATA是ArrayList前面定義的空數(shù)組袖扛,如果是的話砸泛,則取定義的最小容量和默認大小的最大值,DEFAULT_CAPACITY大小前面定義為10蛆封。之后在進行ensureExplicitCapacity(minCapacity)的方法晾嘶。
這里的modCount++先不暫且不管,如果新擴充容量大于目前元素的大小時娶吞,則終于開始進行擴容grow()方法垒迂。
在grow()方法中,首先對舊容量oldCapacity進行1.5倍的擴容妒蛇,之后如果newCapacity仍然小于最小要求容量minCapacity机断,就把minCapacity的值給到newCapacity。如果newCapacity的值大于最大要求容量绣夺,則會走hugeCapacity()方法吏奸,進行一個最終擴容后的大小確認,最后調用Arrays.copyof()方法陶耍,在原數(shù)組的基礎上進行復制奋蔚,容量變?yōu)閚ewCapacity的大小。