Day42--ArrayList
-
定義和概念
ArrayList
是Java集合框架中的一個重要類,它位於java.util
包中。它實現了List
介面,提供了一種動態大小的陣列實現,用於儲存有序的集合元素。與普通陣列不同的是,ArrayList
的大小可以自動增長和收縮,這使得它在處理元素數量不確定的情況時非常方便。
-
建立
ArrayList
物件-
基本語法:
- 有兩種常見的建立
ArrayList
物件的方式。第一種是指定泛型型別並使用無參建構函式建立,例如,要建立一個儲存整數的ArrayList
,可以這樣寫:
ArrayList<Integer> list = new ArrayList<>();
- 這裡
ArrayList<Integer>
中的Integer
是泛型型別引數,表示這個ArrayList
中只能儲存整數型別(int
的包裝類是Integer
)的元素。<>
是Java 7及以後引入的菱形語法,編譯器會根據左邊宣告的型別自動推斷出ArrayList
的具體泛型型別,等同於寫new ArrayList<Integer>();
。 - 第二種方式是使用有參建構函式,例如可以指定初始容量來建立
ArrayList
。如果預先知道要儲存的元素大概數量,可以透過這種方式提高效能,程式碼如下:
ArrayList<String> listWithCapacity = new ArrayList<>(10); // 這裡建立了一個初始容量為10的、儲存字串的ArrayList
- 有兩種常見的建立
-
-
新增元素到
ArrayList
-
add
方法:ArrayList
提供了add
方法用於新增元素。例如,對於前面建立的儲存整數的ArrayList
,可以這樣新增元素:
ArrayList<Integer> list = new ArrayList<>(); list.add(1); list.add(2); list.add(3);
add
方法有兩個過載形式,一種是隻傳入要新增的元素(如上面的例子),元素會被新增到列表的末尾。另一種形式是可以指定插入元素的位置,例如add(int index, E element)
,其中index
是要插入的位置索引,element
是要插入的元素。需要注意的是,索引是從0開始的,而且插入元素時,會將指定索引位置及之後的元素向後移動一個位置。例如:
ArrayList<Integer> list = new ArrayList<>(Arrays.asList(1, 2, 3)); list.add(1, 4); // 在索引為1的位置插入元素4,此時list變為[1, 4, 2, 3]
-
-
訪問
ArrayList
中的元素-
透過索引訪問:
- 可以像訪問陣列元素一樣訪問
ArrayList
中的元素,使用索引來獲取指定位置的元素。例如:
ArrayList<Integer> list = new ArrayList<>(Arrays.asList(1, 2, 3)); int element = list.get(0); // 獲取索引為0的元素,這裡element的值為1
- 這裡使用了
get
方法,它接收一個索引引數,返回該索引位置對應的元素。如果索引超出範圍(小於0或者大於等於ArrayList
的大小),會丟擲IndexOutOfBoundsException
異常。
- 可以像訪問陣列元素一樣訪問
-
-
修改
ArrayList
中的元素-
透過索引修改:
- 可以使用索引來修改
ArrayList
中的元素,例如:
ArrayList<Integer> list = new ArrayList<>(Arrays.asList(1, 2, 3)); list.set(1, 4); // 將索引為1的元素修改為4,此時list變為[1, 4, 3]
- 這裡使用了
set
方法,它接收兩個引數,第一個引數是要修改的元素的索引,第二個引數是新的元素值。如果索引超出範圍,同樣會丟擲IndexOutOfBoundsException
異常。
- 可以使用索引來修改
-
-
刪除
ArrayList
中的元素-
remove
方法:ArrayList
提供了幾種方式來刪除元素。一種是透過元素的值來刪除,例如:
ArrayList<Integer> list = new ArrayList<>(Arrays.asList(1, 2, 3)); list.remove(Integer.valueOf(2)); // 從列表中刪除值為2的元素,此時list變為[1, 3]
- 這裡
remove
方法會刪除第一個匹配到的指定元素,它會呼叫元素的equals
方法來判斷元素是否相等。 - 另一種方式是透過索引來刪除元素,例如:
ArrayList<Integer> list = new ArrayList<>(Arrays.asList(1, 2, 3)); list.remove(0); // 刪除索引為0的元素,此時list變為[2, 3]
- 當透過索引刪除元素時,索引之後的元素會向前移動一個位置。同樣,如果索引超出範圍,會丟擲
IndexOutOfBoundsException
異常。
-
-
獲取
ArrayList
的大小-
size
方法:- 可以使用
size
方法來獲取ArrayList
中當前儲存的元素個數,例如:
ArrayList<Integer> list = new ArrayList<>(Arrays.asList(1, 2, 3)); int size = list.size(); // size的值為3
- 可以使用
-
-
遍歷
ArrayList
-
使用
for
迴圈:- 可以使用傳統的
for
迴圈透過索引來遍歷ArrayList
,例如:
ArrayList<Integer> list = new ArrayList<>(Arrays.asList(1, 2, 3)); for (int i = 0; i < list.size(); i++) { System.out.println(list.get(i)); }
- 這種方式在需要使用索引進行操作或者在迴圈過程中可能會修改列表大小的情況下比較有用。
- 可以使用傳統的
-
使用增強
for
迴圈(foreach
):- 也可以使用增強
for
迴圈來更簡潔地遍歷ArrayList
,例如:
ArrayList<Integer> list = new ArrayList<>(Arrays.asList(1, 2, 3)); for (Integer element : list) { System.out.println(element); }
- 增強
for
迴圈會自動遍歷集合中的每個元素,不需要顯式地使用索引,程式碼更加簡潔,但在迴圈過程中不能方便地獲取元素的索引,並且如果在迴圈內部需要修改集合(如刪除元素),可能會導致ConcurrentModificationException
異常,需要特別注意。
- 也可以使用增強
-
-
ArrayList
與陣列的轉換-
ArrayList
轉陣列:- 可以使用
toArray
方法將ArrayList
轉換為陣列。例如:
ArrayList<Integer> list = new ArrayList<>(Arrays.asList(1, 2, 3)); Integer[] array = list.toArray(new Integer[0]);
- 這裡
toArray
方法接收一個陣列作為引數,如果傳入的陣列大小足夠,就會將ArrayList
中的元素填充到這個陣列中並返回;如果傳入的陣列大小為0(如上面的例子)或者小於ArrayList
的大小,會建立一個新的陣列並返回。
- 可以使用
-
陣列轉
ArrayList
:- 可以使用
Arrays.asList
方法將陣列轉換為ArrayList
,但需要注意的是,這種方式返回的ArrayList
是Arrays
類內部的一個私有靜態內部類,它的add
、remove
等方法會丟擲UnsupportedOperationException
異常,因為它是一個固定大小的檢視,並不是真正的ArrayList
。如果想要一個真正可以修改大小的ArrayList
,可以這樣做:
Integer[] array = {1, 2, 3}; ArrayList<Integer> list = new ArrayList<>(Arrays.asList(array));
- 這樣就建立了一個可以正常新增、刪除等操作的
ArrayList
物件,並且它的初始元素是由陣列中的元素構成的。
- 可以使用
-