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