小又会变小。 在前面的例子中,使用由toString( )方法提供的默认的转换显示类集的内容,toString( ) 方法是从AbstractCollection继承下来的。尽管它对简短的例子程序来说是足够了,然而很少 使用这种方法去显示实际中的类集的内容。通常编程者会提供自己的输出程序。但在下面 的几个例子中,仍将采用由toString( )方法创建的默认输出。 尽管当对象被存储在ArrayList对象中时,其容量会自动增加。仍可以通过调用 ensureCapacity( )方法来人工地增加ArrayList的容量。如果事先知道将在当前能够容纳的类 集中存储许许多多的项时,你可能会想这样做。在开始时,通过一次性地增加它的容量, 就能避免后面的再分配。因为再分配是很花时间的,避免不必要的处理可以改善性能。 ensureCapacity( )方法的特征如下所示: void ensureCapacity(int cap) 这里,cap是新的容量。 相反地,如果想要减小在ArrayList对象之下的数组的大小,以便它有正好容纳当前项 的大小,可以调用trimToSize( )方法。该方法说明如下: void trimToSize( ) 从数组列表(ArrayList)获得数组(Array) 当使用ArrayList时,有时想要获得一个实际的数组,这个数组包含了列表的内容。正 如前面解释的那样,可以通过调用方法toArray( )来实现它。下面是几个为什么可能想将类 集转换成为数组的原因: ? 对于特定的操作,可以获得更快的处理时间。 ? 为了给方法传递数组,而方法不必重载去接收类集。 ? 为了将新的基于类集的程序与不认识类集的老程序集成。 无论何种原因,如下面的例子程序所示,将ArrayList转换成数组是一件繁琐的事情。 // Convert an ArrayList into an array. import java.util.*; class ArrayListToArray { public static void main(String args[]) { // Create an array list ArrayList al = new ArrayList(); // Add elements to the array list al.add(new Integer(1)); al.add(new Integer(2)); al.add(new Integer(3)); al.add(new Integer(4)); System.out.println("Contents of al: " + al); // get array
Object ia[] = al.toArray(); int sum = 0; // sum the array for(int i=0; i<ia.length; i++) sum += ((Integer) ia[i]).intValue(); System.out.println("Sum is: " + sum); } } 该程序的输出如下所示: Contents of al: [1, 2, 3, 4] Sum is: 10 程序开始时创建一个整数的类集。正如上面做出的解释那样,由于不能将原始类型存 储在类集中,因此类型Integer的对象被创建并被保存。接下来,toArray( )方法被调用,它 获得了一个Objects数组。这个数组的内容被置为整型(Integer),接下来对这些值进行求 和。 15.3.2 LinkedList类 LinkedList类扩展AbstractSequentialList并执行List接口。它提供了一个链接列表数据结 构。它具有如下的两个构造函数,说明如下: LinkedList( ) LinkedList(Collection c) 第一个构造函数建立一个空的链接列表。第二个构造函数建立一个链接列表,该链接 列表由类集c中的元素初始化。 除了它继承的方法之外,LinkedList类本身还定义了一些有用的方法,这些方法主要用 于操作和访问列表。使用addFirst( )方法可以在列表头增加元素;使用addLast( )方法可以在 列表的尾部增加元素。它们的形式如下所示: void addFirst(Object obj) void addLast(Object obj) 这里,obj是被增加的项。 调用getFirst( )方法可以获得第一个元素。调用getLast( )方法可以得到最后一个元素。 它们的形式如下所示: Object getFirst( ) Object getLast( ) 为了删除第一个元素,可以使用removeFirst( )方法;为了删除最后一个元素,可以调 用removeLast( )方法。它们的形式如下所示: Object removeFirst( ) Object removeLast( )
下面的程序举例说明了几个LinkedList支持的方法。 // Demonstrate LinkedList. import java.util.*; class LinkedListDemo { public static void main(String args[]) { // create a linked list LinkedList ll = new LinkedList(); // add elements to the linked list ll.add("F"); ll.add("B"); ll.add("D"); ll.add("E"); ll.add("C"); ll.addLast("Z"); ll.addFirst("A"); ll.add(1, "A2"); System.out.println("Original contents of ll: " + ll); // remove elements from the linked list ll.remove("F"); ll.remove(2); System.out.println("Contents of ll after deletion: " + ll); // remove first and last elements ll.removeFirst(); ll.removeLast(); System.out.println("ll after deleting first and last: " + ll); // get and set a value Object val = ll.get(2); ll.set(2, (String) val + " Changed"); System.out.println("ll after change: " + ll); } } 该程序的输出如下所示: Original contents of ll: [A, A2, F, B, D, E, C, Z] Contents of ll after deletion: [A, A2, D, E, C, Z] ll after deleting first and last: [A2, D, E, C] ll after change: [A2, D, E Changed, C] 因为LinkedList实现List接口,调用add(Object)将项目追加到列表的尾部,如同addLast( ) 方法所做的那样。使用add( )方法的add(int, Object)形式,插入项目到指定的位置,如例子