qidao123.com技术社区-IT企服评测·应用市场

标题: Java17中LinkedList类介绍、应用场景和示例代码 [打印本页]

作者: 祗疼妳一个    时间: 2025-3-12 11:07
标题: Java17中LinkedList类介绍、应用场景和示例代码
概述

LinkedList 是 Java 集合框架中基于双向链表实现的类,实现了 List 和 Deque 接口。在 Java 17 中,其焦点实现与旧版本保持一致,但在当代 Java 编程中可以结合新特性(如 var、Stream API)更高效地利用。

一、焦点特性(Java 17 视角)​


二、应用场景


三、Java 17 中的代码示例

1. 创建 LinkedList 并操纵元素(利用 var 关键字)

  1. import java.util.LinkedList;
  2. public class LinkedListDemo {
  3.     public static void main(String[] args) {
  4.         var list = new LinkedList<String>(); // 类型推断(Java 10+)
  5.         // 添加元素(支持链式调用)
  6.         list.add("A")
  7.             .addFirst("B")
  8.             .addLast("C")
  9.             .add(1, "D");
  10.         System.out.println("初始化后: " + list); // 输出: [B, D, A, C]
  11.         // 删除元素(结合 Lambda 表达式)
  12.         list.removeIf(s -> s.equals("A")); // 删除 "A"
  13.         System.out.println("删除后: " + list); // 输出: [B, D, C]
  14.     }
  15. }
复制代码
2. 作为双端队列(Deque)利用

  1. var deque = new LinkedList<Integer>();
  2. // 头部插入
  3. deque.offerFirst(10);
  4. // 尾部插入
  5. deque.offerLast(20);
  6. // 头部删除
  7. System.out.println(deque.pollFirst()); // 输出: 10
  8. // 尾部删除
  9. System.out.println(deque.pollLast());  // 输出: 20
复制代码
3. 结合 Stream API 处理数据

  1. var numbers = new LinkedList<>(List.of(1, 2, 3, 4, 5));
  2. // 过滤偶数并转换为字符串
  3. List<String> result = numbers.stream()
  4.     .filter(n -> n % 2 == 0)
  5.     .map(Object::toString)
  6.     .toList();
  7. System.out.println(result); // 输出: [2, 4]
复制代码
4. 实现 LRU 缓存(最近最少利用)

  1. public class LRUCache<K, V> {
  2.     private final LinkedList<K> accessOrder = new LinkedList<>();
  3.     private final Map<K, V> cache = new HashMap<>();
  4.     private final int capacity;
  5.     public LRUCache(int capacity) {
  6.         this.capacity = capacity;
  7.     }
  8.     public V get(K key) {
  9.         if (cache.containsKey(key)) {
  10.             accessOrder.remove(key);        // 移除旧位置
  11.             accessOrder.addFirst(key);      // 更新为最近访问
  12.             return cache.get(key);
  13.         }
  14.         return null;
  15.     }
  16.     public void put(K key, V value) {
  17.         if (cache.size() >= capacity) {
  18.             K oldest = accessOrder.removeLast(); // 删除最久未使用的键
  19.             cache.remove(oldest);
  20.         }
  21.         accessOrder.addFirst(key);
  22.         cache.put(key, value);
  23.     }
  24. }
复制代码

四、与 ArrayList 的对比(Java 17 优化建议)​

场景LinkedList 实用性ArrayList 实用性​频仍增删✅ 头尾操纵高效,中间操纵需遍历❌ 中间插入/删除需移动元素​随机访问❌ 遍历链表(O(n))✅ 直接索引访问(O(1))​内存占用❌ 存储节点指针占用更多内存✅ 连续内存,空间局部性更优​Java 17 新特性✅ 结合 Stream API 和 var 简化代码✅ 同样实用
五、Java 17 中的注意事项

       1、​避免索引遍历:优先利用迭代器或 forEach 方法:
  1. list.forEach(System.out::println); // 推荐方式
复制代码
       2、​空值处理:答应存储 null,但需注意空指针异常。


​       3、线程安全:多线程情况下利用同步包装类:

  1. var syncList = Collections.synchronizedList(new LinkedList<>());
复制代码
       4、内存敏感场景:链表节点占用更多内存,需谨慎用于大规模数据。

       5、模式匹配:可结合 Java 17 的 switch 模式匹配处理链表元素:

  1. Object element = list.getFirst();
  2. switch (element) {
  3.     case String s -> System.out.println("String: " + s);
  4.     case Integer i -> System.out.println("Integer: " + i);
  5.     default -> System.out.println("Unknown type");
  6. }
复制代码

六、总结

在 Java 17 中,LinkedList 仍旧是处理频仍增删和双端操纵的理想选择,尤其得当队列、栈、缓存等场景。结合当代 Java 特性(如 var、Stream API)可以提升代码简洁性和可读性。若需快速随机访问或内存敏感,优先选择 ArrayList。根据需求选择数据结构,是高效开发的关键!

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 qidao123.com技术社区-IT企服评测·应用市场 (https://dis.qidao123.com/) Powered by Discuz! X3.4