一文詳解Java17中LinkedList類的用法和應用場景
概述
LinkedList 是 Java 集合框架中基于雙向鏈表實現的類,實現了 List 和 Deque 接口。在 Java 17 中,其核心實現與舊版本保持一致,但在現代 Java 編程中可以結合新特性(如 var、Stream API)更高效地使用。
?一、核心特性(Java 17 視角)?
?雙向鏈表結構:每個節(jié)點包含數據、前驅和后繼節(jié)點的引用,與舊版本一致。
?高效增刪操作:頭尾插入/刪除時間復雜度為 ?O(1),中間插入需遍歷鏈表(O(n))。
?低效隨機訪問:按索引訪問需遍歷鏈表(O(n)),性能低于 ArrayList。
?多接口支持:可作為列表、隊列(Queue)、雙端隊列(Deque)或棧(Stack)使用。
?非線程安全:需手動同步或使用 Collections.synchronizedList() 包裝。
?兼容性:完全支持 Java 17 的模塊化系統(tǒng)(JPMS),無縫集成現代 Java 項目。
?二、應用場景
?頻繁增刪數據:如動態(tài)維護任務列表、事件隊列。
?實現隊列/棧:利用 offer()/poll()(隊列)或 push()/pop()(棧)方法。
?操作頭尾元素:例如實現 LRU 緩存、撤銷操作(Undo/Redo)。
?無需預分配內存:鏈表動態(tài)擴展,避免數組復制的開銷。
?結合 Stream API:通過鏈式操作處理數據(如過濾、映射)。
?三、Java 17 中的代碼示例
1. 創(chuàng)建 LinkedList 并操作元素(使用 var 關鍵字)
import java.util.LinkedList;
public class LinkedListDemo {
public static void main(String[] args) {
var list = new LinkedList<String>(); // 類型推斷(Java 10+)
// 添加元素(支持鏈式調用)
list.add("A")
.addFirst("B")
.addLast("C")
.add(1, "D");
System.out.println("初始化后: " + list); // 輸出: [B, D, A, C]
// 刪除元素(結合 Lambda 表達式)
list.removeIf(s -> s.equals("A")); // 刪除 "A"
System.out.println("刪除后: " + list); // 輸出: [B, D, C]
}
}
2. 作為雙端隊列(Deque)使用
var deque = new LinkedList<Integer>(); // 頭部插入 deque.offerFirst(10); // 尾部插入 deque.offerLast(20); // 頭部刪除 System.out.println(deque.pollFirst()); // 輸出: 10 // 尾部刪除 System.out.println(deque.pollLast()); // 輸出: 20
3. 結合 Stream API 處理數據
var numbers = new LinkedList<>(List.of(1, 2, 3, 4, 5));
// 過濾偶數并轉換為字符串
List<String> result = numbers.stream()
.filter(n -> n % 2 == 0)
.map(Object::toString)
.toList();
System.out.println(result); // 輸出: [2, 4]
4. 實現 LRU 緩存(最近最少使用)
public class LRUCache<K, V> {
private final LinkedList<K> accessOrder = new LinkedList<>();
private final Map<K, V> cache = new HashMap<>();
private final int capacity;
public LRUCache(int capacity) {
this.capacity = capacity;
}
public V get(K key) {
if (cache.containsKey(key)) {
accessOrder.remove(key); // 移除舊位置
accessOrder.addFirst(key); // 更新為最近訪問
return cache.get(key);
}
return null;
}
public void put(K key, V value) {
if (cache.size() >= capacity) {
K oldest = accessOrder.removeLast(); // 刪除最久未使用的鍵
cache.remove(oldest);
}
accessOrder.addFirst(key);
cache.put(key, value);
}
}
?四、與 ArrayList 的對比(Java 17 優(yōu)化建議)?
| 場景 | LinkedList 適用性 | ArrayList 適用性 |
|---|---|---|
| ?頻繁增刪 | ? 頭尾操作高效,中間操作需遍歷 | ? 中間插入/刪除需移動元素 |
| ?隨機訪問 | ? 遍歷鏈表(O(n)) | ? 直接索引訪問(O(1)) |
| 內存占用 | ? 存儲節(jié)點指針占用更多內存 | ? 連續(xù)內存,空間局部性更優(yōu) |
| ?Java 17 新特性 | ? 結合 Stream API 和 var 簡化代碼 | ? 同樣適用 |
?五、Java 17 中的注意事項
1、?避免索引遍歷:優(yōu)先使用迭代器或 forEach 方法:
list.forEach(System.out::println); // 推薦方式
2、?空值處理:允許存儲 null,但需注意空指針異常。
3、線程安全:多線程環(huán)境下使用同步包裝類:
var syncList = Collections.synchronizedList(new LinkedList<>());
4、內存敏感場景:鏈表節(jié)點占用更多內存,需謹慎用于大規(guī)模數據。
5、模式匹配:可結合 Java 17 的 switch 模式匹配處理鏈表元素:
Object element = list.getFirst();
switch (element) {
case String s -> System.out.println("String: " + s);
case Integer i -> System.out.println("Integer: " + i);
default -> System.out.println("Unknown type");
}
?六、總結
在 Java 17 中,LinkedList 仍然是處理頻繁增刪和雙端操作的理想選擇,尤其適合隊列、棧、緩存等場景。結合現代 Java 特性(如 var、Stream API)可以提升代碼簡潔性和可讀性。若需快速隨機訪問或內存敏感,優(yōu)先選擇 ArrayList。根據需求選擇數據結構,是高效開發(fā)的關鍵!
到此這篇關于一文詳解Java17中LinkedList類的用法和應用場景的文章就介紹到這了,更多相關Java17 LinkedList類內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
java數據庫開發(fā)之JDBC的完整封裝兼容多種數據庫
這篇文章主要介紹了java數據庫開發(fā)之JDBC的完整封裝兼容多種數據庫,需要的朋友可以參考下2020-02-02
Spring Cloud 2020.0.0正式發(fā)布再見了Netflix
這篇文章主要介紹了Spring Cloud 2020.0.0正式發(fā)布再見了Netflix,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-12-12
spring?jpa集成依賴的環(huán)境準備及實體類倉庫編寫教程
這篇文章主要為大家介紹了spring?jpa集成依賴的環(huán)境準備及實體類倉庫編寫教程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-03-03
解決IDEA使用Spring Initializr創(chuàng)建項目時無法連接到https://start.spring.io的問
這篇文章主要介紹了解決IDEA使用Spring Initializr創(chuàng)建項目時無法連接到https://start.spring.io的問題,本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-04-04
mybatis中關于type-aliases-package的使用
這篇文章主要介紹了mybatis中關于type-aliases-package的使用,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-08-08
Java使用反射和動態(tài)代理實現一個View注解綁定庫
這篇文章主要介紹了Java使用反射和動態(tài)代理實現一個View注解綁定庫,代碼簡潔,使用簡單,擴展性強,結合實例代碼給大家介紹的非常詳細,需要的朋友可以參考下2022-05-05

