Arraylist 类是集合框架中 Vector 类的替代者。它们之间的主要区别是:默认情况下,ArrayList 不是线程同步的,而 Vector 是。它们两个都是按照有序的形式来维护内部的数据。有序指的是在内部元素是按照它们插入时的顺序来存储的。ArrayList 和 Vector 在访问元素时比较快速并可以随机访问某元素;但是如果不在最前面和最后面的时候插入和删除元素比较慢。如果需要经常在列表的中间插入和删除元素,可以考虑使用 LinkedList。
构造方法摘要 构造 ArrayList 在使用 ArrayList 之前,我们首先需要对其进行初始化,即构造一个 ArrayList 对象,以便来使用它。ArrayList 的构造方法有:
ArrayList() 构造一个初始容量为 10 的空列表。
ArrayList(Collection<? extends E> c)
// 构造一个包含指定 collection 的元素的列表,这些元素是按照该 collection 的迭代器返回它们的顺序排列的。
ArrayList(int initialCapacity) 构造一个具有指定初始容量的空列表 这里稍微提醒下,这里的 capacity 是指 ArrayList 的容量。如果 ArrayList 中存放的数据超过容量后,ArrayList 会进行扩容操作,所以在使用时,需要首先考虑我们 ArrayList 需要放多少数据。默认情况下,Sun 的 JDK 实现时,默认的容量为 10,然后在每次到达当前容量后,扩容的公式为:newCapacity= (oldCapacity * 3)/2 + 1。对于使用 Collection 作为参数的构造方法,它是用当前参数给定的集合来创建新的 ArrayList,该操作是将给定的集合复制到当前要构造的 ArrayList 中。该操作完成后,ArrayList 的容量是给定集合的 110%。了解了这些后,给出一个构造 ArrayList 的例子。如下:
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class MainClass {
public static void main(String args[]) throws Exception {
String elements[] = { “A”, “B”, “C”, “D”};
List list = new ArrayList(Arrays.asList(elements));
System.out.println(list);
}
} 上面的代码比较容易,我们首先构造了一个数组然后使用 ArrayList 的第二个构造方法,即接收 Collection 作为参数的构造。然后用了我们之前学过的 Arrays.asList 方法来构造需要的 Collection(ArrayList 实现了 Collection 接口)。最后我们将它输出到控制台。
有些时候,我们在创建了 ArrayList 后不想让别人来修改,这时我们可以通过使用 Collections 类的 unmodifiableList 方法锁定数组。使用该方法后,如果试图修改 ArrayList 的内容,则会抛出 UnsupportedOperationException 来提示用户。下面是一个例子:
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class MainClass {
public static void main(String args[]) throws Exception {
List list = new ArrayList();
list.add(“A”);
list.add(“B”);
list.add(“C”);
list = Collections.unmodifiableList(list);
list.add(1, “G”);
System.out.println(list);
}
} 面的代码中,我们创建了一个 List(注意,ArrayList 实现了 List 接口),然后添加了内容,在中间我们调用了 unmodifiableList 方法使得 List 不可更改,最后我们试图向不可修改的 List 中添加一个新元素。在运行的时候我们会发现该代码会抛出异常。具体的异常大家自己运行下试试。