1 使用方法
ArrayList是數組隊列,可以實作容量的動态增長。ArrayList類繼承了AbstractList抽象類并且實作了List、RandomAccess,Cloneable以及java.io.Serializable接口。
public class ArrayList extends AbstractList implements List, RandomAccess, Cloneable, java.io.Serializable
AbstractList類繼承了AbstractCollection類并實作了List接口。
實作RandomAccess接口使ArrayList擁有随機通路的能力,即通過下表索引通路數組元素。
實作Cloneable接口重寫了接口定義的clone()方法,ArrayList可以使用clone()複制數組。
實作 java.io.Serializable接口使ArrayList支援序列化。
1.1 方法介紹
ArrayList提供了增加、删除、判空等操作,具體提供的方法如下:
// Collection中定義的API
boolean add(E object) //增加元素
boolean addAll(Collection<? extends E> collection) //複制另一個Collection中的所有元素
void clear() //清空數組
boolean contains(Object object) //判斷數組中是否包含object
boolean containsAll(Collection<?> collection) //判斷另一個數組是否是這個數組的子集
boolean equals(Object object) //判斷元素是否相等
int hashCode() //擷取hash code
boolean isEmpty() //判空
Iterator<E> iterator() //疊代器
boolean remove(Object object) //删除元素
boolean removeAll(Collection<?> collection) //删除collection包含的元素
boolean retainAll(Collection<?> collection) //保留collection包含的元素
int size() //擷取數組大小
<T> T[] toArray(T[] array) //轉換成T類型的數組
Object[] toArray() //轉換成Object類型的數組
// AbstractCollection中定義的API
void add(int location, E object) //指定位置增加元素
boolean addAll(int location, Collection<? extends E> collection) //指定位置開始增加多個元素
E get(int location) //擷取location位置的元素
int indexOf(Object object) //擷取object首次出現的位置
int lastIndexOf(Object object) //擷取object最後一次出現的位置
ListIterator<E> listIterator(int location) //疊代器,從location起始
ListIterator<E> listIterator() //疊代器
E remove(int location) //删除location位置的元素
E set(int location, E object) //重置location位置的元素為object
List<E> subList(int start, int end) //擷取[start, end)之間的元素
// ArrayList新增的API
Object clone() //複制元素
void ensureCapacity(int minimumCapacity) //最低容量
void trimToSize() //修剪數組大小為目前元素個數
void removeRange(int fromIndex, int toIndex) //删除[fromIndex, toIndex)之間的元素
1.2 使用示例
package com;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class Main {
public static void main(String[] args) {
// write your code here
List list = new ArrayList<>(); //申請一個初始容量為20的ArrayList
String element; //要填充的元素
for (int i = ; i < ; i++) {
element = "num-" + i;
list.add(element); // 填充list
}
list.add(, "num-10"); //在指定位置增加元素
//使用Iterator周遊list
for (Iterator iter = list.iterator(); iter.hasNext();) {
System.out.print(iter.next() + " ");
}
System.out.println(" ");
System.out.println("The second element is: " + list.get()); //擷取第2個元素
System.out.println("array size is: " + list.size()); //擷取list大小
System.out.println("is array list contains num-15:" + list.contains("num-15")); //判斷list是否含有num-15
list.set(,"num-3-1"); //将第三個元素設定為num-3-1
String[] arr = (String[])list.toArray(new String[]); //将ArrayList轉換為數組
for (String str:arr) { //周遊數組
System.out.print(str + " ");
}
}
}
運作結果如下:
num- num- num- num- num- num- num- num- num- num- num-
The second element is: num-
array size is:
is array list contains num-:false
num- num- num-- num- num- num- num- num- num- num- num-
2 源碼分析
2.1構造函數
ArrayList有三個構造函數,提供三種建立ArrayList執行個體的方法。
/**
* 擷取一個初始長度為initialCapacity的空ArrayList
* @param initialCapacity
*/
public ArrayList(int initialCapacity) {
if (initialCapacity > ) {
this.elementData = new Object[initialCapacity];
} else if (initialCapacity == ) {
this.elementData = EMPTY_ELEMENTDATA;
} else {
throw new IllegalArgumentException("Illegal Capacity: "+
initialCapacity);
}
}
/**
* 傳回一個空ArrayList
*/
public ArrayList() {
this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
}
/**
* 傳回一個用ArrayList,并且用集合c進行初始化
* @param c
*/
public ArrayList(Collection<? extends E> c) {
elementData = c.toArray();
if ((size = elementData.length) != ) {
// c.toArray might (incorrectly) not return Object[] (see 6260652)
if (elementData.getClass() != Object[].class)
elementData = Arrays.copyOf(elementData, size, Object[].class);
} else {
// replace with empty array.
this.elementData = EMPTY_ELEMENTDATA;
}
}
2.2 add方法
/**
* 增加元素
* @param e
* @return
*/
public boolean add(E e) {
ensureCapacityInternal(size + ); // 确定ArrayList長度
elementData[size++] = e; //向數組中增加元素
return true;
}
2.3 remove方法
/**
* 删除元素
* @param index
* @return
*/
public E remove(int index) {
rangeCheck(index); //檢查下标是否合法
modCount++;
E oldValue = elementData(index); //擷取删除的元素
int numMoved = size - index - ;
if (numMoved > ) //移動元素
System.arraycopy(elementData, index+, elementData, index,
numMoved);
elementData[--size] = null; // clear to let GC do its work
return oldValue;
}
2.4 toArray方法
toArray有兩個重載方法,一個不帶參數傳回Object數字,另一個帶參數,傳回任意類型的數組。
/**
* 傳回Object對象的數組
* @return
*/
public Object[] toArray() {
return Arrays.copyOf(elementData, size);
}
/**
* 傳回任意對象類型的數組
* @param a
* @param <T>
* @return
*/
public <T> T[] toArray(T[] a) {
if (a.length < size) //傳入數組大小小于size時,直接傳回一個新數組
// Make a new array of a's runtime type, but my contents:
return (T[]) Arrays.copyOf(elementData, size, a.getClass());
System.arraycopy(elementData, , a, , size); //傳入數組大小大于size,将ArrayList中的内容複制到數組中
if (a.length > size)
a[size] = null;
return a;
}
參考:
[1] http://www.cnblogs.com/skywang12345/p/3308556.html
[2] http://blog.chinaunix.net/uid-29702073-id-4334609.html
[3]http://www.cnblogs.com/hzmark/archive/2012/12/20/ArrayList.html