arraylist的屬性
private static final int default_capacity = 10;
//預設初始容量的大小
private static final object empty_elementdata = {};
//空陣列,用於有參構造時引數為零的例項
private static final object defaultcapacity_empty_elementdata = {};
//用於無參構造時的例項
transient object elementdata;
// 儲存arraylist資料的陣列
private int size;
//arraylist所含元素個數
arraylist的構造方法
帶初始引數的構造方法
public arraylist(int initialcapacity) else if (initialcapacity == 0) else
}不帶初始引數的構造方法
public arraylist()
arraylist的擴容
public void ensurecapacity(int mincapacity)
}//得到最小擴容量
private void ensurecapacityinternal(int mincapacity)
//否則直接去判斷是否需要擴容
ensureexplicitcapacity(mincapacity);
}//判斷是否需要擴容
private void ensureexplicitcapacity(int mincapacity)
/*** 要分配的最大陣列大小
*/private static final int max_array_size = integer.max_value - 8;
/*** arraylist擴容的核心方法。
*/private void grow(int mincapacity)
//比較mincapacity和 max_array_size
private static int hugecapacity(int mincapacity)
arraylist的其他方法
//返回此列表中的元素數。
public int size()
// 如果此列表不包含元素,則返回 true 。
public boolean isempty()
/*** 如果此列表包含指定的元素,則返回true 。
*/public boolean contains(object o)
/***返回此列表中指定元素的首次出現的索引,如果此列表不包含此元素,則為-1
*/public int indexof(object o) else
return -1;
}/**
* 返回此列表中指定元素的最後一次出現的索引,如果此列表不包含元素,則返回-1。.
*/public int lastindexof(object o) else
return -1;
}/**
* 返回此arraylist例項的淺拷貝。 (元素本身不被複製。)
*/public object clone() catch (clonenotsupportedexception e)
}/**
*以正確的順序(從第乙個到最後乙個元素)返回乙個包含此列表中所有元素的陣列。
*返回的陣列將是「安全的」,因為該列表不保留對它的引用。 (換句話說,這個方法必須分配乙個新的陣列)。
*因此,呼叫者可以自由地修改返回的陣列。 此方法充當基於陣列和基於集合的api之間的橋梁。
*/public object toarray()
arraylist對元素的操作
/**
* 返回此列表中指定位置的元素。
*/public e get(int index)
/*** 用指定的元素替換此列表中指定位置的元素。
*/public e set(int index, e element)
/*** 將指定的元素追加到此列表的末尾。
*/public boolean add(e e)
/*** 在此列表中的指定位置插入指定的元素。
*先呼叫 rangecheckforadd 對index進行界限檢查;然後呼叫 ensurecapacityinternal 方法保證capacity足夠大;
*再將從index開始之後的所有成員後移乙個位置;將element插入index位置;最後size加1。
*/public void add(int index, e element)
/*** 刪除該列表中指定位置的元素。 將任何後續元素移動到左側(從其索引中減去乙個元素)。
*/public e remove(int index)
/*** 從列表中刪除指定元素的第乙個出現(如果存在)。 如果列表不包含該元素,則它不會更改。
*返回true,如果此列表包含指定的元素
*/public boolean remove(object o)
} else
}return false;}/*
* private remove method that skips bounds checking and does not
* return the value removed.
*/private void fastremove(int index)
/*** 從列表中刪除所有元素。
*/public void clear()
/*** 按指定集合的iterator返回的順序將指定集合中的所有元素追加到此列表的末尾。
*/public boolean addall(collection<? extends e> c)
/*** 將指定集合中的所有元素插入到此列表中,從指定的位置開始。
*/public boolean addall(int index, collection<? extends e> c)
/*** 從此列表中刪除所有索引為fromindex (含)和toindex之間的元素。
*將任何後續元素移動到左側(減少其索引)。
*/protected void removerange(int fromindex, int toindex)
size = newsize;
}/**
* 檢查給定的索引是否在範圍內。
*/private void rangecheck(int index)
/*** 從此列表中刪除指定集合中包含的所有元素。
*/public boolean removeall(collection<?> c)
/*** 僅保留此列表中包含在指定集合中的元素。
*換句話說,從此列表中刪除其中不包含在指定集合中的所有元素。
*/public boolean retainall(collection<?> c)
那麼copyof()和arraycopy區別是什麼? ArrayList底層原始碼學習
主要為add,get,set,remove,indexof,陣列擴容等內容的學習。擴容 擴容前提 size elementdata.length,也就是元素個數達到了陣列容器的長度。建立新的更大空間的 如size 2 1 陣列物件,object newarray new object size 2 ...
ArrayList底層原始碼實現練習
created by chengbx on 2018 5 17.自己實現乙個arraylist,幫助我們更好的理解arraylist的底層結構!一句話概括arraylist的底層 陣列的擴容與資料的拷貝!public class cbxarraylist public cbxarraylist in...
ArrayList原始碼分析
arraylist是平時使用很多的乙個類,趁有時間,我也閱讀以下原始碼,以幫助自己加深理解。類的層次結構這裡就不列出了,主要分析一下原始碼部分,屬性部分 protected transient int modcount 0 這個屬性是從abstractlist繼承過來的,每次arraylist進行結...