From Gossip@Openhome

Java Gossip: ArrayList

ArrayList類別實作了List介面,List介面是Collection介面的子介面,主要增加了根據索引取得物件的方法。

ArrayList使用陣列實作List介面,所以對於快速的隨機取得物件來說,使用ArrayList可以得到較好的效能,不過在移除物件或插入物件時,ArrayList就比較慢(使用 LinkedList 在這方面就好的多)。

來看看一個ArrayList的範例:

  • ArrayListDemo.java
package onlyfun.caterpillar;

import java.util.*;

public class ArrayListDemo {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);

List<String> list = new ArrayList<String>();

System.out.println("輸入名稱(quit結束)");
while(true) {
System.out.print("# ");
String input = scanner.next();

if(input.equals("quit"))
break;
list.add(input);
}

System.out.print("顯示輸入: ");
for(int i = 0; i < list.size(); i++)
System.out.print(list.get(i) + " ");
System.out.println();
}
}

在 J2SE 5.0 之後新增了泛型(Generic)的功能,使用物件容器時建議容器中將儲存的物件型態,如此您的物件在存入容器會被限定為您所宣告的型態,而取出時,也不至於失去原來的型態資訊,可以避免型態轉換時的問題。

使用add()方法可以將一個物件加入ArrayList中,使用size()方法可以傳回目前的ArrayList的長度,使用get()可以傳回指定索引處的物件,使用toArray()可以將ArrayList中的物件轉換為物件陣列。

以下是執行結果:

輸入名稱(quit結束)
# Justin
# caterpillar
# momor
# quit
顯示輸入: Justin caterpillar momor 


您可以使用get()方法指定索引值取出物件,然而如果您的目的是要循序取出容器中所有的物件,則您可以使用Iterator類,Iterator類實作 Iterator 模式,實際來看個例子:
  • ArrayListDemo.java
package onlyfun.caterpillar;

import java.util.*;

public class ArrayListDemo {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);

List<String> list = new ArrayList<String>();

System.out.println("輸入名稱(quit結束)");
while(true) {
System.out.print("# ");
String input = scanner.next();

if(input.equals("quit"))
break;
list.add(input);
}

Iterator iterator = list.iterator();

while(iterator.hasNext()) {
System.out.print(iterator.next() + " ");
}

System.out.println();
}
}


iterator()方法會傳回一個Iterator物件,這個物件提供的遍訪的方法,hasNext()方法測試Iterator中是否還有物件,如果 有的話,可以使用next()取出。

事實上,在J2SE 5.0您也不必須使用iterator()了,使用增強的for迴圈可以直接遍訪List的所有元素,例如:

  • ArrayListDemo.java
package onlyfun.caterpillar;

import java.util.*;

public class ArrayListDemo {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);

List<String> list = new ArrayList<String>();

System.out.println("輸入名稱(quit結束)");
while(true) {
System.out.print("# ");
String input = scanner.next();

if(input.equals("quit"))
break;
list.add(input);
}

for(String s : list) {
System.out.print(s + " ");
}

System.out.println();
}
}