ArraList原始碼解析之擴容機制

2021-10-10 13:13:46 字數 2310 閱讀 7793

2 擴容機制

因為**挺多的,所以分為幾次來分析。首先先弄明白,使用的原理先,也就是先分析一下,arraylist是怎麼建立的、怎麼新增元素先。

平時建立一般都是直接new乙個arraylist的物件。下面來看一下,建立的幾種方式,以及不同之處。

//帶有初始容量的構造方法。

//如果引數大於0,則直接new乙個大小一樣的object物件陣列,此時容量就是你的初始值,非負數就行。

//如果等於0,引用乙個空的object陣列。empty_elementdata

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

}//預設的構造方法,直接將儲存資料的資料指向defaultcapacity_empty_elementdata;

public arraylist()

public arraylist(collection<? extends e> c) else

}

上面可以看見,arraylist陣列儲存元素的是乙個叫做elementdata的引用,也就是乙個object型別的陣列。

//乙個空的陣列物件

private static final object empty_elementdata = {};

//乙個空的陣列物件

private static final object defaultcapacity_empty_elementdata = {};

//這是儲存物件的真正引用

transient object elementdata;

可以看到,有兩個不同的為空的陣列物件引用。主要的區別就是,如果建立arraylist的時候,如果指定了容量,就會建立乙個相同大小的陣列。如果指定容量為0,那麼就直接引用 empty_elementdata。如果是預設建立的話,就直接引用defaultcapacity_empty_elementdata。

這兩者的主要區別就是前者前者新增第乙個資料後擴容為1。後者在新增第乙個元素後,會擴充容量為10。

下面就來講解一些add()方法。

public boolean add(e e)
add方法比較簡單。首先呼叫乙個叫ensurecapacityinternal(size + 1)。size就是現在arraylist內元素的個數。

private void ensurecapacityinternal(int mincapacity) 

ensureexplicitcapacity(mincapacity);

}

這個方法也比較簡單,就是判斷是不是使用無參構造創造的arraylist物件。如果是的話,那麼mincapcity就是賦值為10。

private void ensureexplicitcapacity(int mincapacity)
這個就是判斷是否需要擴容。

看到這裡,大家應該明白mincapcity是什麼意思了。就是首先在新增元素的時候,先將當前的size+1進行探測,如果沒有超過容量大小的話,就在陣列後面新增元素,size加一。如果大於當前容量的話,就先擴容,呼叫grow方法,再新增資料。

private void grow(int mincapacity)
首先獲得原來的容量大小。將容量擴容為原來的1.5倍。

int newcapacity = oldcapacity + (oldcapacity >> 1)
如果擴容的大小比探測的大小還小。探測大小就是擴容大小。主要情況有無參建立arraylist的第一次add資料時和容量為0時。

if (newcapacity - mincapacity < 0)

newcapacity = mincapacity;

if (newcapacity - max_array_size > 0)

newcapacity = hugecapacity(mincapacity);

// mincapacity is usually close to size, so this is a win:

elementdata = arrays.copyof(elementdata, newcapacity);

這兩個就不用說了吧,就是已經到了最大容量情況和複製陣列。

就是arraylist的擴容機制就是原來的1.5倍。特殊情況就是size+1(容量為0時)的情況和10(預設情況下)的情況

ArraList原始碼分析

一 對於arraylist需要掌握的七點內容 二 原始碼分析 2.1 arraylist的建立 常見的兩種方式 liststrlist new arraylist liststrlist2 new arraylist 2 是建立list的時候 private transient object ele...

Spring原始碼解析之 Aop原始碼解析(2)

spring aop 更多的是oop開發模式的乙個補充,幫助oop以更好的方式來解決對於需要解決業務功能模組之上統一管理 的功能 以一副圖來做為aop功能的說明更直觀些。對於類似系統的安全檢查,系統日誌,事務管理等相關功能,物件導向的開發方法並沒有更好的解決方法 aop引入了一些概念。更多的是spr...

原始碼解析 JDK原始碼之LinkedHashMap

linkedhashmap原始碼,基於 jdk1.6.43 他繼承了hashmap,並且實現了插入和訪問的有序功能 public class linkedhashmapextends hashmapimplements map 其也有乙個entry內部類,繼承了 hashmap 的entry 內部類...