1. ArrayList是什麼?¶
在Java中,ArrayList是java.util包下的一個類,它實現了動態數組的功能。簡單來說,ArrayList就像一個可以自動擴容的數組——我們不需要手動指定它的長度,當元素數量超過當前容量時,它會自動“長大”,也可以隨時添加或刪除元素,非常靈活。
與普通數組(如int[])相比,ArrayList的核心優勢是長度可變,且提供了一系列便捷的方法來操作元素(增刪改查、遍歷等),適合存儲和管理不確定長度的數據集合。
2. 爲什麼選擇ArrayList?¶
假設我們需要存儲一個班級的學生名單:
- 如果用普通數組,必須先定義固定長度(比如String[] students = new String[50]),但學生人數可能多於50,或少於50,容易造成空間浪費或數組越界。
- 如果用ArrayList,直接new ArrayList<String>()就能創建一個空列表,後續可以隨時添加學生(add()方法),不需要擔心長度問題。
此外,ArrayList還封裝了很多實用方法(如排序、查找),讓操作更簡單,無需重複寫數組相關的複雜邏輯。
3. 基本操作:創建與初始化¶
要使用ArrayList,首先需要導入java.util.ArrayList包,然後通過構造方法創建對象。泛型(<E>)用於指定列表中元素的類型(如字符串、整數等),避免類型錯誤。
import java.util.ArrayList; // 導入ArrayList類
public class ArrayListDemo {
public static void main(String[] args) {
// 創建一個存儲String類型的ArrayList(空列表)
ArrayList<String> fruits = new ArrayList<>();
// 也可以指定初始容量(可選,提前規劃容量可減少擴容次數)
ArrayList<Integer> numbers = new ArrayList<>(10); // 初始容量爲10
}
}
4. 添加元素:add()方法¶
使用add(E e)方法可以在列表末尾添加元素,add(int index, E e)可以在指定位置插入元素。
// 1. 在末尾添加元素
fruits.add("蘋果");
fruits.add("香蕉");
fruits.add("橙子");
// 2. 在指定位置插入元素(例如在索引1處插入“西瓜”)
fruits.add(1, "西瓜");
// 此時列表內容:[蘋果, 西瓜, 香蕉, 橙子]
5. 獲取元素:get()方法¶
通過get(int index)獲取指定位置的元素,索引從0開始(如果索引超過列表長度或爲負數,會拋出IndexOutOfBoundsException異常)。
// 獲取第1個元素(索引0)
String first = fruits.get(0); // "蘋果"
// 獲取最後一個元素(索引爲size()-1)
String last = fruits.get(fruits.size() - 1); // "橙子"
6. 修改元素:set()方法¶
使用set(int index, E element)替換指定位置的元素,並返回舊元素。
// 將索引1的元素(“西瓜”)替換爲“葡萄”
String oldElement = fruits.set(1, "葡萄");
// 替換後列表:[蘋果, 葡萄, 香蕉, 橙子]
// oldElement的值爲“西瓜”
7. 刪除元素:remove()方法¶
刪除元素有兩種方式:
- remove(int index):刪除指定索引的元素,返回被刪除的元素。
- remove(Object o):刪除第一個與o匹配的元素(若有重複元素,僅刪除第一個)。
// 1. 刪除索引2的元素(“香蕉”)
String removed = fruits.remove(2); // 返回“香蕉”
// 刪除後列表:[蘋果, 葡萄, 橙子]
// 2. 刪除元素“橙子”(注意:remove(對象)需要元素類型匹配)
fruits.remove("橙子");
// 刪除後列表:[蘋果, 葡萄]
8. 遍歷ArrayList:如何打印所有元素?¶
遍歷是使用列表的核心場景之一,常見方式有3種:
方式1:普通for循環(通過索引)¶
for (int i = 0; i < fruits.size(); i++) {
System.out.println(fruits.get(i)); // 逐個打印元素
}
方式2:增強for循環(for-each)¶
適合只需要遍歷元素,不需要修改索引的場景。
for (String fruit : fruits) {
System.out.println(fruit); // 直接遍歷元素
}
方式3:迭代器(Iterator)¶
適合需要邊遍歷邊刪除元素的場景(普通for循環刪除會導致索引變化,容易出錯)。
import java.util.Iterator;
Iterator<String> iterator = fruits.iterator();
while (iterator.hasNext()) {
String fruit = iterator.next();
System.out.println(fruit);
// 若需刪除元素,使用iterator.remove()
// if (fruit.equals("葡萄")) iterator.remove();
}
9. 動態擴容:容量不夠怎麼辦?¶
ArrayList會在添加元素時自動擴容:當元素數量超過當前容量時,它會創建一個新的數組(初始容量爲10,之後每次擴容到原來的1.5倍左右),並將舊數組的元素複製到新數組中。
例如:
- 初始容量爲10,添加10個元素後,容量已滿;
- 再添加第11個元素時,容量會自動擴容到15(10的1.5倍),並複製所有元素到新數組。
注意:擴容是自動的,無需手動處理,這也是ArrayList的核心優勢之一(不用擔心“數組滿了”的問題)。
10. 注意事項¶
- 索引越界:操作時索引必須在
0到size()-1之間,否則會報錯(如get(-1)或remove(5)但列表只有3個元素)。 - 泛型約束:創建時指定的元素類型(如
<String>)必須統一,否則編譯報錯(無法添加其他類型元素)。 - 重複元素:
remove(Object o)只會刪除第一個匹配的元素(若有重複,需多次調用)。
11. 完整示例¶
import java.util.ArrayList;
import java.util.Iterator;
public class ArrayListFullDemo {
public static void main(String[] args) {
// 1. 創建列表
ArrayList<String> animals = new ArrayList<>();
// 2. 添加元素
animals.add("貓");
animals.add("狗");
animals.add("兔子");
System.out.println("初始列表:" + animals); // [貓, 狗, 兔子]
// 3. 修改元素
animals.set(1, "老虎"); // 替換索引1的“狗”爲“老虎”
System.out.println("修改後:" + animals); // [貓, 老虎, 兔子]
// 4. 刪除元素
animals.remove(0); // 刪除索引0的“貓”
System.out.println("刪除後:" + animals); // [老虎, 兔子]
// 5. 遍歷元素(增強for循環)
System.out.println("遍歷元素:");
for (String animal : animals) {
System.out.println(animal);
}
// 6. 使用迭代器遍歷
System.out.println("迭代器遍歷:");
Iterator<String> it = animals.iterator();
while (it.hasNext()) {
System.out.println(it.next());
}
}
}
總結¶
ArrayList是Java中最基礎也最常用的動態數組工具,掌握它的核心操作(增刪改查、遍歷)能幫你快速處理不確定長度的數據。記住:靈活、自動擴容、無需關心容量是它的三大優勢,多動手練習(如存儲學生信息、商品列表等場景)就能熟練掌握!
如果需要更復雜的操作(如排序、查找),可以後續學習Collections工具類或ArrayList的其他方法,但打好基礎永遠是關鍵。