ArrayList简介
ArrayList 是一个数组行列步队,相称于动态数组。与Java中的数组比较,它的容量能动态增长。它继续于AbstractList,实现了List, RandomAccess, Cloneable, java.io.Serializable这些接口。
ArrayList 继续了AbstractList,实现了List。它是一个数组行列步队,供应了干系的添加、删除、修正、遍历等功能。

ArrayList 实现了RandmoAccess接口,即供应了随机访问功能。
ArrayList 实现了Cloneable接口,即覆盖了函数clone(),能被克隆。
ArrayList 实现java.io.Serializable接口,这意味着ArrayList支持序列化,能通过序列化去传输。
ArrayList包含了两个主要的工具:elementData和size。
(01) elementData 是\"大众Object[]类型的数组\公众,它保存了添加到ArrayList中的元素。实际上,elementData是个动态数组,我们能通过布局函数 ArrayList(int initialCapacity)来实行它的初始容量为initialCapacity;如果通过不含参数的布局函数ArrayList()来创建ArrayList,则elementData的容量默认是10。elementData数组的大小会根据ArrayList容量的增长而动态的增长,详细的增长办法,请参考源码剖析中的ensureCapacity()函数。
(02) size 则是动态数组的实际大小。
ArrayList遍历办法ArrayList支持3种遍历办法
(01) 第一种,通过迭代器遍历。即通过Iterator去遍历。
Integer value = null;
Iterator iter = list.iterator();
while (iter.hasNext()) {
value = (Integer)iter.next();
}
(02) 第二种,随机访问,通过索引值去遍历。
由于ArrayList实现了RandomAccess接口,它支持通过索引值去随机访问元素。
Integer value = null;
int size = list.size();
for (int i=0; i<size; i++) {
value = (Integer)list.get(i);
}
(03) 第三种,for循环遍历。如下:
Integer value = null;
for (Integer integ:list) {
value = integ;
}
下面通过一个实例,比较这3种办法的效率,实例代码(ArrayListRandomAccessTest.java)如下:
package lxh.demo.listdemotest;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
/
ArrayList 遍历办法和效率的测试程序
@author 沐兮沐楚
/
public class ArrayListRandomAccessTest {
public static void main(String[] args) {
List list = new ArrayList();
for(int i = 0; i < 100000; i++) {
list.add(i);
}
iteratorThroughRandomAccess(list);
iteratorThroughIterator(list);
iteratorThroughFor(list);
}
/
随机访问,通过索引值去遍历
/
public static void iteratorThroughRandomAccess(List list) {
long startTime = System.currentTimeMillis();
for(int i = 0; i < list.size(); i++) {
list.get(i);
}
long endTime = System.currentTimeMillis();
System.out.println(\"大众iteratorThroughRandomAccess: \"大众 + (endTime-startTime) + \"大众ms\公众);
}
/
通过迭代器遍历
/
public static void iteratorThroughIterator(List list) {
long startTime = System.currentTimeMillis();
for(Iterator iter = list.iterator(); iter.hasNext();) {
iter.next();
}
long endTime = System.currentTimeMillis();
System.out.println(\"大众iteratorThroughIterator: \公众 + (endTime-startTime) + \"大众ms\"大众);
}
/
for循环遍历
/
public static void iteratorThroughFor(List list) {
long startTime = System.currentTimeMillis();
for(Object obj : list) {
;
}
long endTime = System.currentTimeMillis();
System.out.println(\"大众iteratorThroughFor: \公众 + (endTime-startTime) + \"大众ms\"大众);
}
}
iteratorThroughRandomAccess: 3ms
iteratorThroughIterator: 4ms
iteratorThroughFor: 4ms
由此可见,遍历ArrayList时,利用随机访问(即,通过索引序号访问)效率最高,而利用迭代器的效率最低!
本文通过一个实例(ArrayListTest.java),先容 ArrayList 中常用API的用法。
package lxh.demo.listdemotest;
import java.util.ArrayList;
import java.util.Iterator;
/
ArrayList常用API的测试程序
@author 沐兮沐楚
/
public class ArrayListTest {
public static void main(String[] args) {
//创建ArrayList
ArrayList list = new ArrayList();
//添加元素
list.add(\"大众1\"大众);
list.add(\"大众2\"大众);
list.add(\"大众3\"大众);
list.add(\公众4\"大众);
//添加到第一个位置
list.add(0,\"大众5\"大众);
//输出当前List元素和大小
System.out.println(\公众element: \"大众 + list + \"大众\nsize: \公众 + list.size());
//获取第一个元素
System.out.println(\"大众the first element is: \"大众 + list.get(0));
//删除\"大众3\公众
list.remove(3);
//获取ArrayList的大小
System.out.println(\"大众Arraylist size = \"大众 + list.size());
//判断list中是否包含\"大众3\"大众
System.out.println(\"大众ArrayList contains 3 is: \"大众 + list.contains(3));
//设置第二个元素为10
list.set(1, \公众10\公众);
//通过Iterator遍历ArrayList
for(Iterator iter = list.iterator(); iter.hasNext();) {
System.out.println(\"大众next is: \"大众 + iter.next());
}
//将ArrayList转换为数组
String[] arr = (String[]) list.toArray(new String[0]);
for(String str : arr) {
System.out.println(\公众str: \"大众 + str);
}
//清空ArrayList
list.clear();
//判断ArrayList是否为空
System.out.println(\"大众ArrayList is empty: \公众 + list.isEmpty());
}
}
element: [5, 1, 2, 3, 4]
size: 5
the first element is: 5
Arraylist size = 4
ArrayList contains 3 is: false
next is: 5
next is: 10
next is: 2
next is: 4
str: 5
str: 10
str: 2
str: 4
ArrayList is empty: true