首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

java会合学习(1)—ArrayList

2012-08-24 
java集合学习(1)—ArrayList1、ArrayList概述:??????? ArrayList是List接口的可变数组的实现。实现了所有可选

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()); 

热点排行