java集合学习(1)—ArrayList
1、ArrayList概述:
??????? ArrayList是List接口的可变数组的实现。实现了所有可选列表操作,可以包含包括null任何元素。除了实现List接口外,此类还提供一些方法来操作内部用来存储列表的数组的大小。(此类大致上等同于Vector 类,除了此类是不同步的。)
?????? 每个ArrayList都有一个容量,该容量是用来存储列表元素的数组大小。它总是至少等于列表的大小。随着向ArrayList中增加元素,ArrayList的容量也随之增加。添加大量元素 前,应用程序也可以使用ensureCapacity操作来增加ArrayList实例的容量,这可以减少递增式再分配的数量。
????? 注意,此实现不是同步的。如果多个线程同时访问一个 ArrayList 实例,而其中至少一个线程从结构上修改了列表,那么它必须 保持外部同步。这一般通过对自然封装该列表的对象进行同步操作来完成。如果不存在这样的对象,则应该使用Collections.synchronizedList
方法将该列表“包装”起来。
ArrayList继承AbstractList,实现了List、RandomAccess、Cloneable和java.io.Serializable接口:
public class ArrayList<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, java.io.Serializable
?
?
?内部定义了一个Object类型的数组来保存,transient的意思是不进行序列化,这跟Serializable相对。
private transient Object[] elementData;
ArrayList的长度
private int size;
三个构造函数:
public ArrayList(int initialCapacity) {//指定ArrayList初始容量大小
??? super();
????if (initialCapacity < 0)//初始容量不能小于0,否则抛出IllegalArgumentException异常
????????throw new IllegalArgumentException("Illegal Capacity: "+
?????????????????????????????????????????????? initialCapacity);
??? this.elementData = new Object[initialCapacity];
}
?
public ArrayList() {//默认使用初始容量为10
??? this(10);
}
?
public ArrayList(Collection<? extends E> c) {//将Collection转换为ArrayList
??? elementData = c.toArray();//调用toArray()方法,将collection转换为数组,collection为null,此处便会抛出NullPointerException
??? size = elementData.length;
??? // c.toArray might (incorrectly) not return Object[] (see 6260652)
??? if (elementData.getClass() != Object[].class)
???????? elementData = Arrays.copyOf(elementData, size, Object[].class);
}
???????? 参数是Collection的构造函数需要重点说明一下:这里的问题是由于Arrays.asList()方法造成的,当Arrays.asList(T t)方法中参数类型是Object的子类,比如String类型时,该方法返回值做为参数传递给ArrayList构造函数,那么执行该构造函数中的过程中调用toArray()方法时,由于使用的是clone()方法,所以会返回String[]类型的数组,而并非Obejct[]类型的数组,执行下面代码中的print方法也是可以看得到返回值类型的。此时再向toArray()返回对象中增加Object对象就会抛出异常。具体的讲解可以参考http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6260652
List<Object> list = new ArrayList<Object>(Arrays.asList("test1", "test2"));
//返回String[],而Obejct[]类型
//System.out.println(Arrays.asList("foo", "bar").toArray());
//将Object对象增加到list中时就会抛出ArrayStoreException
list.set(0, new Object());