Java ArrayList基礎:動態數組操作,初學者必學

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. 注意事項

  • 索引越界:操作時索引必須在0size()-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的其他方法,但打好基礎永遠是關鍵。

小夜