今天看了下arraylist 的原始碼 原本以為內部會比較複雜 但是沒想到內部原始碼很簡單。。。 在這裡簡要記錄下吧 相信只要看過原始碼 就能看懂。。
繼承和實現了以下介面和類
public class arraylistextends abstractlistimplements cloneable, serializable, randomaccess
成員變數 只有3個
private static final int min_capacity_increment = 12; //最小的增長容量
int size; //當前集合的元素數量
transient object array; //真正存放資料的陣列
三個建構函式:
public arraylist(int capacity)
array = (capacity == 0 ? emptyarray.object : new object[capacity]);
}public arraylist()
public arraylist(collection<? extends e> collection)
object a = collection.toarray();
if (a.getclass() != object.class)
array = a;
size = a.length;
}
下面來看看最常用的幾個方法 add get remove
@override public boolean add(e object)
a[s] = object; //賦值元素
size = s + 1; //大小加1
modcount++; //修改次數增加
return true;
}
@override public void add(int index, e object)
if (s < a.length) else
a[index] = object; //把要插入的值 插入
size = s + 1;
modcount++;
}
@suppresswarnings("unchecked") @override public e get(int index)
return (e) array[index];
}
@override public e remove(int index)
@suppresswarnings("unchecked") e result = (e) a[index];
system.arraycopy(a, index + 1, a, index, --s - index);
a[s] = null; // prevent memory leak
size = s;
modcount++;
return result;
}
下面看一下最重要的乙個方法
public static native void arraycopy(object src, int srcpos, object dst, int dstpos, int length);
第乙個引數是 資源物件 第二個引數是要複製的開始位置 第三個引數是目標物件 第四個引數是目標物件開始的位置 最後乙個是 要複製的長度
也就是 把src中的從srcpos位置開始 複製 length哥元素到 dst的dstpos位置到 dstpos+length-1位置
這就ok了。。。真的挺簡單。。
Java ArrayList擴容機制
底部採用動態陣列實現資料增加,刪除。size arraylist的實際存放資料個數,即我們常說的list長度,size 函式 elementdate elementdate,arraylist實際存放資料的陣列,可動態擴容,我們所說的就是動態改變elementdate.length,從而達到擴容,實...
java ArrayList原始碼學習
該類繼承於abstractlist,裡面對於資料和結構的操作如下。trimtosize 更新size,如果size小於 陣列的 lenth,則更新size的大小。public void ensurecapacity int mincapacity 確保容量,如果不夠就擴容成原來的1.5倍 1 pub...
Java ArrayList原始碼分析
private static final int default capacity 10 transient object elementdata 擴容函式 private void grow int mincapacity public static native void arraycopy o...