一、arraylist資料結構
arraylist底層是陣列實現的,陣列元素的型別是object型別,可以動態的增長和縮減。
arraylist先繼承abstractlist,abstractlist實現list介面
二、arraylist的屬性
//版本號
private static final long serialversionuid = 8683452581122892189l;
//初始化預設值
private static final int default_capacity = 10;
//指定arraylist容量為10時,返回該空物件陣列
private static final object empty_elementdata = {};
//呼叫無參構造方法時,返回該空物件陣列。它與empty_elementdata最大的區別是:該陣列是預設返回的,而empty_elementdata是使用者指定容量為0時返回的
private static final object defaultcapacity_empty_elementdata = {};
//儲存元素陣列
transient object elementdata;
//元素大小
private int size;
//最大陣列容量
private static final int max_array_size = integer.max_value - 8;
三、構造方法
arraylist有三個構造方法
(1)arraylistint (int initialcapacity)
/*指定乙個初始容量為initialcapacity的空arraylist*/
public arraylist(int initialcapacity) else if (initialcapacity == 0) else
}
(2)arraylist()
/* 構造乙個初始容量為 10 的空列表 */
public arraylist()
(3)arraylist(collection<? extends e> c)
/*構造乙個包含指定 collection 的元素的列表,這些元素是按照該 collection 的迭代器返回它們的順序排列的*/
public arraylist(collection<? extends e> c) else
}
四、核心方法
(1)add(e e):將元素新增到列表的尾部
public boolean add(e e)
//陣列容量檢查,不夠時進行擴容,mincapacity為需要的最小容量
public void ensurecapacity(int mincapacity)
}//陣列容量檢查,不夠時進行擴容
private void ensurecapacityinternal(int mincapacity)
ensureexplicitcapacity(mincapacity); }
//陣列容量檢查,不夠時擴容
private void ensureexplicitcapacity(int mincapacity)
//擴容
private void grow(int mincapacity)
//進行大容量分配
private static int hugecapacity(int mincapacity)
總結:
add(e e)方法進行擴容的步驟:
①先進行空間檢查,看是否需要擴容,若需要擴容,確定最少需要擴容的容量
②確定擴容後,執行grow(int mincapacity)方法,mincapacity為最小需要擴容的容量
③第一次擴容, newcapacity = oldcapacity + (oldcapacity >> 1);在原有容量基礎上增加一半
④第一次擴容後,判斷容量是否還小於需要的最小擴容容量mincapacity,若還小於,將容量擴充為mincapacity
⑤對擴容後的容量進行判斷,如果擴容後的容量大於最大的臨界值,則進行大容量分配。如果需要的容量大於max_array_size,分配 integer.max_value 否則分配max_array_size
(2)add(int index,e element):在指定位置新增元素
public void add(int index, e element)
//越界檢查
private void rangecheckforadd(int index)
總結:
①越界檢查,若越界丟擲異常
②確定容量,判斷容量是否足夠,不夠進行擴容
③移動元素,騰出需要插入元素的空間,插入元素
(3)remove(int index):刪除指定位置的元素
public e remove(int index)
總結:
刪除指定位置的元素:
①越界檢查,若越界丟擲異常
②計算需要移動的元素個數,元素個數大於0,則需要把要刪除元素之後的所有元素向左移動,覆蓋掉要刪除的元素
③刪除的元素賦值為null
(4)remove(object 0):移除此列表中首次出現的指定元素
public boolean remove(object o)
} else
}return false;
}private void fastremove(int index)
(5)set(int index,e element):用指定的元素替代此列表中指定位置上的元素
public e set(int index, e element)
(6)get(int index):返回此列表中指定位置上的元素
public e get(int index)
//返回索引為index的元素
e elementdata(int index)
總結:
arraylist底層本質是elementdata陣列,在資料的查詢方面會很快,但是在增加、刪除方面相對慢點,因為有可能需要移動大量的元素。arraylist初始容量為10,根據需求會進行相應的擴容。
arraylist和vector的區別:
①arraylist是執行緒不安全的,vector是執行緒安全的(synchronized),當多條執行緒訪問同乙個arraylist集合時,需要手動保證該集合的同步性,而vector則不用。
②arraylist和vector都採用線性連續儲存空間,當儲存空間不足的時候,arraylist預設增加為原來的50%(newcapacity = oldcapacity + (oldcapacity >> 1)),vector預設增加為原來的一倍(newcapacity = oldcapacity + ((capacityincrement > 0) ?
capacityincrement : oldcapacity))
Java集合 ArrayList集合
以陣列實現。節約空間,但是陣列有容量限制。超出限制時會增加50 容量,用system.arraycopy 複製到新的陣列,因此最好能給出陣列大小的預估值。預設第一次插入元素時建立大小為10 的陣列。按照陣列下標來訪問元素 get i set i,e 的效能很高,這是陣列的基本優勢。直接在陣列末尾加入...
Java基礎 集合ArrayList
集合類 物件導向類,對事物的描述都是通過物件實現。為方便對多個物件進行操作,必須對多個物件進行儲存,因此需要容器類。容器類特點是長度可變。stringbuilder只能存放字串。int等陣列雖能存放自定義型別,但長度固定。arraylist是一種特殊的資料型別,泛型。arraylist 構造乙個初始...
Java學習筆記 集合Arraylist
arraylist集合 arraylist list new arraylist 可以使object型也可以是類。通過例子說明arraylist的使用方法 arraylist list new arraylist list.add i 向list中新增乙個值object型的i值,list.add i...