ArrayList 擴容原理

2022-06-05 17:15:08 字數 1561 閱讀 9031

面試中經常問到的問題之一就是list的擴容機制了,他是怎麼做到擴容的,大家都能答出來底層是陣列,複製乙個陣列來擴容,但是再具體一點來說,大家就不知道該怎麼說了,如果不看原始碼說這麼多確實就差不多了,但是看了原始碼你會說的更多,更詳細,更具體,本篇主要看的是jdk1.8  至於其他版本大同小異,看看就知道了,言歸正傳

總的來說就是分兩步:1、擴容

把原來的陣列複製到另乙個記憶體空間更大的陣列中

2、新增元素

把新元素新增到擴容以後的陣列中

先把arraylist中定義的一些屬性貼出來方便下面原始碼分析

分析之前我們先看一下arraylist的兩個構造方法

arraylist()
arraylist(int initialcapacity)
無參構造:
public arraylist() 

帶參構造:

public arraylist(int initialcapacity)  else if (initialcapacity == 0)  else 

}

在無參構造中,我們看到了在用無參構造來建立物件的時候其實就是建立了乙個空陣列,長度為0

在有參構造中,傳入的引數是正整數就按照傳入的引數來確定建立陣列的大小,否則異常

接下來我們來看擴容,擴容的方法就是 add(e e)

貼上原始碼

看,其實add方法就兩步,第一步:增加長度,第二步:新增元素到陣列,第二步沒什麼說的,我們看看ensurecapacityinternal(int mincapacity)這個增加長度的方法

這個地方我們看到了,如果在新增的時候遠陣列是空的,就直接給乙個10的長度,否則的話就加一

if (mincapacity - elementdata.length > 0)

grow(mincapacity);

通過這個地方是真正的增加長度,當需要的長度大於原來陣列長度的時候就需要擴容了,相反的則不需要擴容

這個地方注意這一句 

int newcapacity = oldcapacity + (oldcapacity >> 1);

oldcapacity >> 1    右移運算子   原來長度的一半 再加上原長度也就是每次擴容是原來的1.5倍

之前的所有都是確定新陣列的長度,確定之後就是把老陣列copy到新陣列中,這樣陣列的擴容就結束了

以上的一切都是arraylist擴容的第一步,第二步就沒啥說的了,就是把需要新增的元素新增到陣列的最後一位

原始碼本不難,想的多看的少了就難了

ArrayList 擴容原理

面試中經常問到的問題之一就是list的擴容機制了,他是怎麼做到擴容的,大家都能答出來底層是陣列,複製乙個陣列來擴容,但是再具體一點來說,大家就不知道該怎麼說了,如果不看原始碼說這麼多確實就差不多了,但是看了原始碼你會說的更多,更詳細,更具體,本篇主要看的是jdk1.8 至於其他版本大同小異,看看就知...

ArrayList擴容機制實現原理(原始碼分析)

3.總結 建構函式原始碼。private static final int default capacity 10 預設容量大小 private static final object defaultcapacity empty elementdata 空陣列 1.預設建構函式,使用初始容量10構造...

ArrayList擴容機制

1.成員變數 預設給定的初始容量 private static final int default capacity 10 無參構造器中所使用到的空陣列例項 private static final object empty elementdata 有參構造器中所使用到的空陣列例項 private ...