一、對於arraylist需要掌握的七點內容
二、原始碼分析
2.1、arraylist的建立(常見的兩種方式)
liststrlist = new arraylist();
liststrlist2 = new arraylist(2);
arraylist源**:
基本屬性:
//物件陣列:arraylist的底層資料結構
private transient object elementdata;
//elementdata中已存放的元素的個數,注意:不是elementdata的容量
private int size;
注意:
arraylist構造器:
/**
* 建立乙個容量為initialcapacity的空的(size==0)物件陣列
*/public arraylist(int initialcapacity)
if (initialcapacity < 0)
throw new illegalargumentexception("illegal capacity:" + initialcapacity);
this.elementdata = new object[initialcapacity];
}/**
* 預設初始化乙個容量為10的物件陣列
*/public arraylist() 構造器
}
在我們執行new arraylist()時,會呼叫上邊的無參構造器,創造乙個容量為10的物件陣列。
在我們執行new arraylist(2)時,會呼叫上邊的public arraylist(int initialcapacity),創造乙個容量為2的物件陣列。
注意:
protected abstractlist()
2.2、往arraylist中新增物件(常見的兩個方法add(e)和addall(collection<? extends e> c))
2.2.1、add(e)
strlist2.add("hello");
arraylist源**:
/**
* 向elementdata中新增元素
*/public boolean add(e e)
/**
* 確保陣列的容量足夠存放新加入的元素,若不夠,要擴容
*/public void ensurecapacity(int mincapacity)
}
在上述**的擴容結束後,呼叫了arrays.copyof(elementdata, newcapacity)方法,這個方法中:對於我們這裡而言,先建立了乙個新的容量為newcapacity的物件陣列,然後使用system.arraycopy()方法將舊的物件陣列複製到新的物件陣列中去了。
注意:2.2.2、addall(collection<? extends e> c)
使用方式:
liststrlist = new arraylist();
strlist.add("jigang");
strlist.add("nana");
strlist.add("nana2");
liststrlist2 = new arraylist(2);
strlist2.addall(strlist);
源**:
/**
* 將c全部加入elementdata
*/public boolean addall(collection<? extends e> c)
/**
* 確保陣列的容量足夠存放新加入的元素,若不夠,要擴容
*/public void ensurecapacity(int mincapacity)
}
注意:
2.2.3、add(int index, e element)
/**
* 在特定位置(只能是已有元素的陣列的特定位置)index插入元素e
*/public void add(int index, e element)
/** * 檢查索引index是否超出size-1
*/private void rangecheck(int index)
2.3、獲取arraylist中的單個物件(get(int index))
實現方式:
arrayliststrlist2 = new arraylist(2);
strlist2.add("hello");
strlist2.add("nana");
strlist2.add("nana2");
system.out.println(strlist2.get(0));
源**:
/** * 按照索引查詢物件e
*/public e get(int index)
/** * 檢查索引index是否超出size-1
*/private void rangecheck(int index)
2.4、刪除arraylist中的物件
2.4.1、remove(object o)
使用方式:
strlist2.remove("hello");
源**:
/*** 從前向後移除第乙個出現的元素o
*/public boolean remove(object o)
} else
}return false;}/*
* 刪除單個位置的元素,是arraylist的私有方法
*/private void fastremove(int index)
2.4.2、remove(int index)
使用方式:
strlist2.remove(0);源**:
/**
* 刪除指定索引index下的元素,返回被刪除的元素
*/public e remove(int index)
/* * 刪除單個位置的元素,是arraylist的私有方法
*/private void fastremove(int index)
注意:
2.5、判斷物件是否存在於arraylist中(contains(e))
源**:
/**
* 判斷動態陣列是否包含元素o
*/public boolean contains(object o)
/*** 返回第乙個出現的元素o的索引位置
*/public int indexof(object o) else
return -1;//若不包含,返回-1
}/**
* 返回最後乙個出現的元素o的索引位置
*/public int lastindexof(object o) else
return -1;
}
2.6、遍歷arraylist中的物件(iterator())
使用方式:
liststrlist = new arraylist();
strlist.add("jigang");
strlist.add("nana");
strlist.add("nana2");
iteratorit = strlist.iterator();
while (it.hasnext())
源**:iterator()方法是在abstractlist中實現的,該方法返回abstractlist的乙個內部類itr物件
public iteratoriterator()
itr:
private class itr implements iterator
//獲取元素
public e next() catch (indexoutofbound***ception e)
}//檢測在遍歷的過程中,是否發生了add、remove等操作
final void checkforcomodification()
}
遍歷的整個流程結合"使用方式"與"itr的注釋"來看。注:上述的itr我去掉了乙個此時用不到的方法和屬性。
三、總結
ArrayList底層實現
modifier and type method and description boolean add e e 將指定的元素追加到此列表的末尾 void add int index,e element 在此列表中的指定位置插入指定的元素。boolean addall collection exte...
ArrayList的底層實現
1 底層是object陣列,叫做 elementdata 2 預設容量10,叫做 default capacity,不是初始容量 3 如果不指定初始容量,剛new出來的list如果沒有儲存任何物件,則容量為0,但是如果指定了初始容量,剛開始size也是為0 arraylistlist new arr...
Java集合中ArrayList的實現原理
arraylist是list介面的可變陣列的實現。每個arraylist例項都有乙個容量,該容量是指用來儲存列表元素的陣列的大小。隨著向arraylist中不斷新增元素,其容量也自動增長。自動增長會帶來資料向新陣列的重新拷貝,在新增大量元素前,應用程式也可以使用ensurecapacity操作來增加...