作為一名 Java 開發工程師,你一定在項目中頻繁使用過 List
集合。它是 Java 集合框架中最常用、最靈活的數據結構之一。無論是從數據庫查詢出的數據,還是前端傳遞的參數列表,List
都是處理這些數據的首選結構。
本文將帶你全面掌握:
List
?接口的核心方法與特性- 常見實現類(如?
ArrayList
、LinkedList
、Vector
、CopyOnWriteArrayList
) List
?的遍歷、增刪改查、排序、線程安全等操作List
?在實際業務中的應用場景List
?與數組、集合工具類(如?Arrays.asList()
、Collections
)的結合使用- 最佳實踐與常見誤區
并通過豐富的代碼示例和真實項目場景講解,幫助你寫出更高效、結構更清晰的 Java 列表代碼。
🧱 一、什么是?List
?集合?
List
是 Java 集合框架中 Collection
接口的子接口,表示一個有序、可重復、可通過索引訪問的元素集合。
??List
?的核心特性:
特性 | 描述 |
---|---|
有序 | 元素按照插入順序存儲 |
可重復 | 允許添加重復元素 |
可索引訪問 | 支持通過?get(index) ?獲取元素 |
可動態擴容 | 如?ArrayList ?會自動擴容 |
支持泛型 | 推薦使用泛型來保證類型安全 |
🔍 二、List
?的常見實現類
實現類 | 特點 | 適用場景 |
---|---|---|
ArrayList | 基于數組實現,查詢快,增刪慢 | 默認列表實現,適合頻繁讀取 |
LinkedList | 基于鏈表實現,增刪快,查詢慢 | 插入刪除頻繁、隊列操作 |
Vector | 線程安全,性能較低 | 舊版本遺留類,建議使用?Collections.synchronizedList() |
CopyOnWriteArrayList | 線程安全,寫時復制,讀操作不加鎖 | 多讀少寫的并發場景 |
🧠 三、List
?的基本操作
? 1. 創建與初始化
// 使用 ArrayList 初始化
List<String> list = new ArrayList<>();// 靜態初始化
List<String> list2 = Arrays.asList("Java", "Python", "C++");// 不可變列表(Java 9+)
List<String> list3 = List.of("A", "B", "C");
? 2. 添加元素
list.add("Java"); // 添加到末尾
list.add(0, "Go"); // 插入到指定索引
list.addAll(Arrays.asList("Python", "JavaScript")); // 添加集合
? 3. 刪除元素
list.remove("Java"); // 按值刪除
list.remove(0); // 按索引刪除
list.clear(); // 清空列表
? 4. 修改元素
list.set(0, "Kotlin"); // 替換指定索引的元素
? 5. 查詢元素
String first = list.get(0); // 獲取指定索引元素
boolean contains = list.contains("Java"); // 是否包含某個元素
int index = list.indexOf("Java"); // 查找元素索引
? 6. 遍歷方式對比
遍歷方式 | 示例 | 特點 |
---|---|---|
普通 for 循環 | for (int i = 0; i < list.size(); i++) | 支持索引操作 |
增強 for 循環 | for (String s : list) | 簡潔易讀 |
Iterator 迭代器 | Iterator<String> it = list.iterator(); while (it.hasNext()) | 支持在遍歷中刪除 |
Stream 流式處理 | list.stream().forEach(System.out::println) | 支持過濾、映射、排序等操作 |
🔁 四、List
?的高級操作
? 1. 排序
// 默認排序(升序)
list.sort(null);// 自定義排序(降序)
list.sort(Collections.reverseOrder());// 使用 Lambda 表達式排序
list.sort((a, b) -> b.compareTo(a));
? 2. 反轉與洗牌
Collections.reverse(list); // 反轉列表
Collections.shuffle(list); // 打亂順序(隨機排列)
? 3. 子列表與替換
List<String> subList = list.subList(0, 3); // 獲取子列表 [0, 3)
Collections.replaceAll(list, "Java", "JVM"); // 替換所有匹配元素
? 4. 轉換為數組
String[] array = list.toArray(new String[0]);
? 5. 合并與去重
List<String> combined = new ArrayList<>();
combined.addAll(list1);
combined.addAll(list2);Set<String> unique = new LinkedHashSet<>(combined);
List<String> deduplicated = new ArrayList<>(unique);
🧪 五、List
?的實際應用場景
場景1:從數據庫查詢結果封裝為?List
List<User> users = new ArrayList<>();
try (ResultSet rs = statement.executeQuery("SELECT * FROM users")) {while (rs.next()) {User user = new User(rs.getString("name"), rs.getInt("age"));users.add(user);}
}
場景2:前端參數接收(Spring Boot)
@PostMapping("/save")
public void saveUsers(@RequestBody List<User> users) {userService.saveAll(users);
}
場景3:使用?List
?實現簡單的緩存
List<CacheItem> cache = new ArrayList<>();public void put(String key, String value) {cache.add(new CacheItem(key, value));
}public String get(String key) {return cache.stream().filter(item -> item.getKey().equals(key)).map(CacheItem::getValue).findFirst().orElse(null);
}
場景4:多線程安全的?List
List<String> list = Collections.synchronizedList(new ArrayList<>());
// 或者
List<String> list = new CopyOnWriteArrayList<>();
🚫 六、常見誤區與注意事項
誤區 | 正確做法 |
---|---|
在遍歷中直接刪除元素 | 使用?Iterator.remove() |
使用?== ?比較字符串元素 | 使用?equals() ?或?Objects.equals() |
忘記初始化?List ?就使用 | 先?new ArrayList<>() |
忘記處理?null ?元素 | List ?允許添加?null ,但某些操作會拋出異常 |
忽略線程安全問題 | 多線程建議使用?CopyOnWriteArrayList ?或同步包裝 |
錯誤使用?List.of() ?修改列表 | List.of(...) ?是不可變列表,修改會拋出異常 |
📊 七、List
?核心知識點一覽表
內容 | 說明 |
---|---|
接口定義 | List<E> |
常用實現類 | ArrayList 、LinkedList 、CopyOnWriteArrayList |
核心方法 | add、remove、set、get、size、contains、indexOf |
遍歷方式 | 普通 for、增強 for、Iterator、Stream |
常用操作 | 排序、反轉、子列表、合并、去重 |
線程安全 | Collections.synchronizedList() 、CopyOnWriteArrayList |
應用場景 | 數據庫結果集、前端參數接收、緩存、任務隊列 |
📎 八、附錄:List
?常用技巧速查表
技巧 | 示例 |
---|---|
創建只讀列表 | Collections.unmodifiableList(list) |
同步列表 | Collections.synchronizedList(new ArrayList<>()) |
列表轉數組 | list.toArray(new String[0]) |
判斷是否為空 | list.isEmpty() |
獲取最大最小值 | Collections.max(list) ?/?Collections.min(list) |
列表反轉 | Collections.reverse(list) |
列表洗牌 | Collections.shuffle(list) |
替換所有元素 | Collections.replaceAll(list, "old", "new") |
使用 Stream 過濾 | list.stream().filter(s -> s.startsWith("A")).toList() |
使用 Stream 轉換 | list.stream().map(String::toUpperCase).toList() |
如果你正在準備一篇面向初學者的技術博客,或者希望系統回顧 Java 基礎知識,這篇文章將為你提供完整的知識體系和實用的編程技巧。
歡迎點贊、收藏、轉發,也歡迎留言交流你在實際項目中遇到的 List
集合相關問題。我們下期再見 👋
📌 關注我,獲取更多Java核心技術深度解析!