简要介绍
- ArrayList是基于动态数组实现的,其容量能自动增长。
- ArrayList继承了AbstractList,实现了List,提供了相关的添加、删除、修改、遍历等功能。
- ArrayList实现了RandmoAccess接口,即提供了随机访问功能。RandmoAccess是java中用来被List实现,为List提供快速随机访问功能。
- ArrayList实现了Cloneable接口,即覆盖了函数clone(),能被克隆。
- ArrayList实现java.io.Serializable接口,支持序列化,能通过序列化去传输。
- ArrayList中的操作不是线程安全的!一般在单线程中使用ArrayList,而在多线程中可以选择Vector或者CopyOnWriteArrayList;也可以考虑collections.synchronizedList(List
l)函数返回一个线程安全的ArrayList类。
源码
略
ArrayList使用
public static void main(String[] srgs){
ArrayList<Integer> arr = new ArrayList<Integer>();
System.out.println("Before add arr size=: "+arr.size());
arr.add(1);
arr.add(2);
arr.add(3);
arr.add(4);
arr.add(5);
System.out.println("After add arr size=: "+arr.size());
System.out.println("通过for循环遍历");
for(int i = 0; i<arr.size(); ++i){
System.out.println(arr.get(i));
}
System.out.println("通过迭代器遍历");
Iterator<Integer> iter = arr.iterator();
while(iter.hasNext()){
System.out.println(iter.next());
}
System.out.println("通过foreach遍历");
for(Integer i:arr){
System.out.println(i);
}
arr.remove(2);
System.out.println("after arr.remove(2): "+arr);
arr.remove((Object)4);
System.out.println("after arr.remove((Object)3): "+arr);
arr.add(2, 3);
System.out.println("after arr.add(2, 3): "+arr);
arr.clear();
System.out.println("after clear: "+arr);
System.out.println("is empty: "+arr.isEmpty());
}
/************************ 打印如下:********************
Before add arr size=: 0
After add arr size=: 5
通过for循环遍历
1
2
3
4
5
通过迭代器遍历
1
2
3
4
5
通过foreach遍历
1
2
3
4
5
after arr.remove(2): [1, 2, 4, 5]
after arr.remove((Object)3): [1, 2, 5]
after arr.add(2, 3): [1, 2, 3, 5]
after clear: []
is empty: true
*************************************************/
重点总结
1.toArray()的使用
有时候,当我们调用ArrayList中的 toArray(),可能遇到过抛出java.lang.ClassCastException异常的情况,这是由于toArray() 返回的是 Object[] 数组,将 Object[]转换为其它类型(如,将Object[]转换为的Integer[])则会抛出java.lang.ClassCastException异常,因为Java不支持向下转型。
所以一般更常用的是使用另外一种方法进行使用:
T[] toArray(T[] a)
调用toArray(T[] a)返回T[]可通以下方式进行实现:
// toArray用法
// 第一种方式(最常用)
Integer[] integer = arrayList.toArray(new Integer[0]);
// 第二种方式(容易理解)
Integer[] integer1 = new Integer[arrayList.size()];
arrayList.toArray(integer1);
// 抛出异常,java不支持向下转型
//Integer[] integer2 = new Integer[arrayList.size()];
//integer2 = arrayList.toArray();
2.ArrayList基于数组实现,可以通过下标索引直接查找到指定位置的元素,因此查找效率高,但每次插入或删除元素,就要大量地移动元素,插入删除元素的效率低。
3.注意其三个不同的构造方法。无参构造方法构造的ArrayList的容量默认为10;带有Collection参数的构造方法,将Collection转化为数组赋给ArrayList的实现数组elementData。
public ArrayList(int initialCapacity) {
if (initialCapacity > 0) {
this.elementData = new Object[initialCapacity];
} else if (initialCapacity == 0) {
this.elementData = EMPTY_ELEMENTDATA;
} else {
throw new IllegalArgumentException("Illegal Capacity: "+
initialCapacity);
}
}
public ArrayList() {
this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
}
public ArrayList(Collection<? extends E> c) {
elementData = c.toArray();
if ((size = elementData.length) != 0) {
// 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;
}
}