ArrayList 原始碼思路

2021-08-21 07:23:17 字數 1862 閱讀 9666

具體的方法實現只會過一下,不足處歡迎小夥伴批評指出。

大家都知道arraylist是個動態陣列具體用到會實現擴容,下面我會圍繞這個來簡單講一下

1.繼承、介面

abstractlist // 對list的行為一些具體的實現,不過arraylist 基本重寫了

list  //標準list的約定方法

randomaccess //這個純粹就是底層演算法的一種判斷能力,別聽網上瞎說,其實表示的是從下標1拿資料和下標99拿資料一樣快

cloneable //複製能力 這個了解深淺拷貝的同學就會知道

serializable //序列化嘍

2.基本變數

private static final int default_capacity = 10; //初始化大小

transient object elementdata;//儲存元素的陣列

private int size;//元素的大小, 這裡指的實際儲存大小

3.方法

//新增元素

public boolean add(e e) {

ensurecapacityinternal(size + 1);  //這個比較有趣 其實是動態新增陣列的 一系列操作,最核心的,新增的元素不滿足陣列長度就動態擴容

elementdata[size++] = e;

return true;

//陣列擴容

private void grow(int mincapacity) {

// overflow-conscious code

int oldcapacity = elementdata.length;

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

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

別的方法沒啥可講 看看就明白

4.子類

itr //內部私有類 實現iterator 介面 這個就是大家常用的迭代器的具體實現,講到迭代器就扯一下設計模式中的迭代器模式,總體來說就是操作迭代,和儲存的集合分離,以方便修改替換,這裡用子類來實現的,也就是我們設計中常說的,物件組合而不是繼承。

listitr //內部私有類 集合itr 實現iterator 相當於樓上的擴充套件

sublist //內部私有類 繼承abstractlist 實現randomaccess 其實好雞肋,他相當於乙個檢視,就是通過sublist方法返回的的物件操作的方法等同於操作原物件

//這個就是裡面的具體方法

public void add(int index, e e) {

rangecheckforadd(index);

checkforcomodification();

parent.add(parentoffset + index, e);  //這裡的parent就是呼叫時傳過來的

this.modcount = parent.modcount;

this.size++;

arraylistspliterator // 內部私有類 實現spliterator 這個就吊了哦, 這是平行計算的

具體的可以看這個 就不剽竊了

ArrayList原始碼解析和設計思路

當第乙個元素新增的時候,陣列會擴容到預設容量default capacity 10 三種初始化方式 無參初始化 指定大小初始化 指定初始資料初始化 private static final object defaultcapacity empty elementdata public arrayli...

ArrayList原始碼分析

arraylist是平時使用很多的乙個類,趁有時間,我也閱讀以下原始碼,以幫助自己加深理解。類的層次結構這裡就不列出了,主要分析一下原始碼部分,屬性部分 protected transient int modcount 0 這個屬性是從abstractlist繼承過來的,每次arraylist進行結...

ArrayList原始碼剖析

建構函式 有3個建構函式 1 在jdk原始碼中arraylist無參的建構函式,預設初始化大小是10 2 帶有指定大小引數的建構函式 3 帶有集合引數的建構函式 一 確定arrarlist的容量 1 若arraylist的容量不足以容納當前的全部元素,設定新的容量 原始容量 3 2 1。2 如果擴容...