開課吧Java課堂:什麼是ArrayList類
ArrayList類擴充套件AbstractList並執行List介面。ArrayList支援可隨需要而增長的動態陣列。在Java中,標準陣列是定長的。在陣列建立之後,它們不能被加長或縮短,這也就意味著你必須事先知道陣列可以容納多少元素。
但是,你直到執行時才能知道需要多大的陣列。為了解決這個問題,類集框架定義了ArrayList。本質上,ArrayList是物件引用的一個變長陣列。也就是說,ArrayList能夠動態地增加或減小其大小。陣列列表以一個原始大小被建立。當超過了它的大小,類集自動增大。當物件被刪除後,陣列就可以縮小。
注意:動態陣列也被從以前版本遺留下來的類Vector所支援。關於這一點,將在章後面介紹。ArrayList有如下的建構函式:
ArrayList( )
ArrayList(Collection c)
ArrayList(int capacity)
其中第一個建構函式建立一個空的陣列列表。第二個建構函式建立一個數組列表,該陣列列表由類集c中的元素初始化。第三個建構函式建立一個數組列表,該陣列有指定的初始容量(capacity)。容量是用於儲存元素的基本陣列的大小。當元素被追加到陣列列表上時,容量會自動增加。
下面的程式展示了ArrayList的一個簡單應用。首先建立一個數組列表,接著新增型別String的物件(回想一個引用字串被轉化成一個字串(String)物件)。接著列表被顯示出來。將其中的一些元素刪除後,再一次顯示列表。
// Demonstrate ArrayList.
import java.util.*;
class ArrayListDemo {
public static void main(String args[]) {
// create an array list
ArrayList al = new ArrayList();
System.out.println("Initial size of al: " +
al.size());
// add elements to the array list
al.add("C");
al.add("A");
al.add("E");
al.add("B");
al.add("D");
al.add("F");
al.add(1, "A2");
System.out.println("Size of al after additions: " +
al.size());
// display the array list
System.out.println("Contents of al: " + al);
// Remove elements from the array list
al.remove("F");
al.remove(2);
System.out.println("Size of al after deletions: " +
al.size());
System.out.println("Contents of al: " + al);
}
}
該程式的輸出如下所示:
Initial size of al: 0
Size of al after additions: 7
Contents of al: [C, A2, A, E, B, D, F]
Size of al after deletions: 5
Contents of al: [C, A2, E, B, D]
注意a1開始時是空的,當新增元素後,它的大小增加了。當有元素被刪除後,它的大小又會變小。
在前面的例子中,使用由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),接下來對這些值進行求和。