十分想念順店雜可。。。
ArrayList
?是 Java 集合框架中最常用的類之一,實現了?List
?接口,底層基于動態數組實現,支持動態擴容,相比普通數組更靈活。以下是其詳細介紹及用法:
一、核心特性
- 動態大小:無需預先指定容量,可自動擴容(初始容量為 10,滿后擴容為原容量的 1.5 倍)。
- 允許重復元素:可存儲多個相同值的元素。
- 有序集合:元素按插入順序排列,支持通過索引訪問。
- 非線程安全:多線程環境下并發修改可能導致異常(需手動同步或使用?
CopyOnWriteArrayList
)。 - 存儲引用類型:只能存儲對象(基本類型需用包裝類,如?
Integer
?而非?int
)。
二、基本用法(代碼示例)
1. 引入包與創建對象
ArrayList
?位于?java.util
?包,需先導入,創建時需指定泛型(元素類型):
import java.util.ArrayList;
import java.util.List;public class ArrayListDemo {public static void main(String[] args) {// 創建存儲String類型的ArrayList(推薦聲明為List接口)List<String> list = new ArrayList<>();// 可指定初始容量(減少擴容次數,優化性能)List<Integer> numList = new ArrayList<>(20); // 初始容量20}
}
2. 常用方法
(1)添加元素:add()
List<String> list = new ArrayList<>();
list.add("Java"); // 末尾添加元素 → [Java]
list.add(0, "Python"); // 指定索引插入 → [Python, Java](索引需≤當前size)
list.addAll(List.of("C", "C++")); // 批量添加 → [Python, Java, C, C++]
(2)訪問元素:get()
通過索引獲取元素(索引從 0 開始,需注意?IndexOutOfBoundsException
):
String first = list.get(0); // 獲取第1個元素 → "Python"
int size = list.size(); // 獲取元素個數 → 4
(3)修改元素:set()
替換指定索引的元素,返回被替換的舊值:
String old = list.set(1, "JavaScript"); // 替換索引1的元素 → 舊值"Java"
// 此時list為 [Python, JavaScript, C, C++]
(4)刪除元素:remove()
String removed = list.remove(2); // 移除索引2的元素 → 返回"C",list變為 [Python, JavaScript, C++]
boolean isRemoved = list.remove("C++"); // 移除指定值的元素 → 返回true,list變為 [Python, JavaScript]
(5)判斷與查找
boolean isEmpty = list.isEmpty(); // 判斷是否為空 → false
boolean contains = list.contains("Python"); // 是否包含指定元素 → true
int index = list.indexOf("JavaScript"); // 首次出現的索引 → 1
int lastIndex = list.lastIndexOf("Python"); // 最后出現的索引 → 0(元素唯一時與indexOf相同)
(6)清空與截取
list.clear(); // 清空所有元素 → list變為空
List<String> subList = list.subList(0, 2); // 截取子列表(從索引0到2,不含2)→ [Python, JavaScript]
3. 遍歷方式
(1)普通 for 循環(通過索引)
for (int i = 0; i < list.size(); i++) {System.out.println(list.get(i));
}
(2)增強 for 循環(foreach)
for (String element : list) {System.out.println(element);
}
(3)迭代器(Iterator
)
支持在遍歷中安全刪除元素:
import java.util.Iterator;Iterator<String> iterator = list.iterator();
while (iterator.hasNext()) {String element = iterator.next();if (element.equals("Python")) {iterator.remove(); // 安全刪除當前元素}
}
(4)Java 8+ 流(Stream)
list.stream().forEach(System.out::println); // 簡化遍歷
三、注意事項
擴容機制:當元素數量超過當前容量時,ArrayList 會自動擴容為原容量的 1.5 倍(通過?
Arrays.copyOf()
?復制數組)。若預知元素數量,創建時指定初始容量可減少擴容次數(提升性能)。與數組的轉換:
// ArrayList → 數組 String[] arr = list.toArray(new String[0]); // 推薦傳遞類型數組,避免強制轉換// 數組 → ArrayList(注意:返回的是固定大小的List,不能添加/刪除元素) List<String> fixedList = Arrays.asList(arr); // 若需可變List,需再包裝一次: List<String> mutableList = new ArrayList<>(Arrays.asList(arr));
與 LinkedList 的對比:
ArrayList
?基于數組,隨機訪問快(get(index)
?時間復雜度 O (1)),增刪中間元素慢(需移動元素,O (n))。LinkedList
?基于鏈表,增刪中間元素快(O(1)),隨機訪問慢(O(n))。- 頻繁查改選?
ArrayList
,頻繁增刪中間元素選?LinkedList
。
線程安全:多線程環境下,可使用?
Collections.synchronizedList()
?包裝:List<String> safeList = Collections.synchronizedList(new ArrayList<>());
四、總結
ArrayList
?是日常開發中最常用的 List 實現,以動態數組為核心,兼顧靈活性與訪問效率,適合大多數場景。掌握其?add()
、get()
、remove()
?等方法及遍歷方式,結合擴容機制和線程安全特性,可更高效地使用。