认识List列表之LinkedList

本文深入探讨了LinkedList类在Java中的应用,特别是在作为堆栈、队列和双端队列时的独特方法。介绍了如何进行头部和尾部操作、使用迭代器、获取和移除元素等关键功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

LinkedList提供了将链接列表用作堆栈、队列或双端队列的方法,这里不再重复介绍List的标准操作,只给出其独特方法的使用。

请注意其已经实现的接口
    Serializable, Cloneable, Iterable<E>, Collection<E>, Deque<E>, List<E>, Queue<E>
  1. package collection.lession9;
  2. import java.util.Arrays;
  3. import java.util.Iterator;
  4. import java.util.LinkedList;
  5. import java.util.List;
  6. /**
  7.  * 老紫竹JAVA提高教程(6)-认识List列表之LinkedList<br>
  8.  * 实现了双向队列的控制,包括头尾的操作<br>
  9.  * 可用于堆栈和FIFO操作等。 <br>
  10.  * <br>
  11.  * 相关API请查看 api.java2000.net/LinkedList
  12.  * 
  13.  * @author 老紫竹 JAVA世纪网(java2000.net)
  14.  * 
  15.  */
  16. public class Lession9 {
  17.   public static void main(String[] args) {
  18.     // 对于List的基础操作,这里不再重复
  19.     // 请自行查看介绍List的内容
  20.     // 这里专注于LinkedList所引入的特性部分
  21.     //
  22.     LinkedList<String> list = new LinkedList<String>();
  23.     list.add("1111");
  24.     list.add("2222");
  25.     list.add("3333");
  26.     showList(list); // [1111, 2222, 3333]
  27.     // 在列表的最头部增加一个
  28.     list.addFirst("head");
  29.     showList(list); // [head, 1111, 2222, 3333]
  30.     // 测试反向的迭代器
  31.     // 正常的迭代器应该是从第一个数据开始
  32.     // 这个是从最后一个开始,这也是LinkedList的特点
  33.     Iterator<String> it = list.descendingIterator();
  34.     while (it.hasNext()) {
  35.       System.out.print(it.next() + ","); // 3333,2222,1111,head,
  36.     }
  37.     System.out.println();
  38.     // 获取列表的第一个数据,且继续保留这个数据
  39.     // 内部都是 getFirst,无任何区别
  40.     System.out.println(list.element()); // head
  41.     System.out.println(list.getFirst()); // head
  42.     // 如果长度为0,会返回null,否则和getFirst相同
  43.     System.out.println(list.peek()); // head
  44.     System.out.println(list.peekFirst()); // head
  45.     // 获取列表的最后一个数据,且继续保留这个数据
  46.     System.out.println(list.getLast()); // 3333
  47.     // 如果长度为0,会返回null,否则和getLast相同
  48.     System.out.println(list.peekLast()); // 3333
  49.     // 在列表末尾增加一个数据
  50.     list.offer("tail");
  51.     showList(list); // [head, 1111, 2222, 3333, tail]
  52.     // 在列表最前面增加一个数据
  53.     // 内部通过 addFirst 实现的
  54.     list.offerFirst("----");
  55.     showList(list); // [----, head, 1111, 2222, 3333, tail]
  56.     // 在列表末尾增加一个数据
  57.     // 内部通过 addLast实现的
  58.     list.offerLast("====");
  59.     showList(list); // [----, head, 1111, 2222, 3333, tail, ====]
  60.     // 获取列表的第一个数据,并从删除这个数据
  61.     System.out.println(list.poll()); // ----
  62.     System.out.println(list.pollFirst()); // head
  63.     // 获取列表的最后一个数据,并从删除这个数据
  64.     System.out.println(list.pollLast()); // ====
  65.     // 以堆栈的形式存入一个数据
  66.     // 将该元素插入此列表的开头
  67.     // 内部通过 addFirst实现
  68.     list.push("xyz");
  69.     showList(list); // [xyz, 1111, 2222, 3333, tail]
  70.     // 以堆栈的形式弹出一个数据
  71.     // 移除并返回第一个数据
  72.     // 内部通过 removeFirst 实现
  73.     System.out.println(list.pop()); // xyz
  74.     showList(list); // [1111, 2222, 3333, tail]
  75.     // 删除并返回第一个数据
  76.     System.out.println(list.removeFirst()); // 1111
  77.     showList(list); // [2222, 3333, tail]
  78.     // 删除列表中第一次出现的这个数据
  79.     // 内部通过 remove(Object)实现
  80.     System.out.println(list.removeFirstOccurrence("3333")); // true
  81.     showList(list); // [2222, tail]
  82.     // 删除并返回最后一个数据
  83.     System.out.println(list.removeLast()); // tail
  84.     showList(list); // [2222]
  85.     // 删除列表中最后一次出现的这个数据
  86.     System.out.println(list.removeLastOccurrence("2222")); // true
  87.     showList(list); // []
  88.   }
  89.   /**
  90.    * 显示List里面的数据。
  91.    * 
  92.    * @param list
  93.    */
  94.   private static void showList(List list) {
  95.     System.out.println(Arrays.toString(list.toArray()));
  96.   }
  97. }
运行结果
[1111, 2222, 3333]
[head, 1111, 2222, 3333]
3333,2222,1111,head,
head
head
head
head
3333
3333
[head, 1111, 2222, 3333, tail]
[----, head, 1111, 2222, 3333, tail]
[----, head, 1111, 2222, 3333, tail, ====]
----
head
====
[xyz, 1111, 2222, 3333, tail]
xyz
[1111, 2222, 3333, tail]
1111
[2222, 3333, tail]
true
[2222, tail]
tail
[2222]
true
[]


总结:
    这个类具有很大的灵活性,也是常用的列表实现类之一。不多说了,总之必须掌握就是了。
### Java 中 `LinkedList` 集合类的详细介绍 #### 定义与特性 `java.util.LinkedList` 是基于双向链表实现的一种线性列表,在此结构下,每个节点不仅保存数据还维护着前后两个方向上的链接。这使得它非常适合频繁插入和删除操作的应用场景[^1]。 #### 基本使用案例 为了展示如何创建并初始化一个简单的 `LinkedList<String>` 实例以及对其进行基本的操作(如添加元素),可以参考如下代码片段: ```java import java.util.LinkedList; public class Example { public static void main(String[] args) { // 创建存储字符串类型的 LinkedList 对象 LinkedList<String> linkedList = new LinkedList<>(); // 向集合中添加多个元素 linkedList.add("Java"); linkedList.add("is"); linkedList.add("awesome"); // 输出所有元素到控制台 for (String element : linkedList) { System.out.println(element); } } } ``` 这段程序会依次打印出 `"Java"`、`"is"` 和 `"awesome"` 这三个单词[^2]。 #### 主要方法概览 除了常见的增删改查功能外,`LinkedList` 提供了一些特有的API接口来支持队列(Queue)/栈(Stack)的行为模式: - **作为双端队列**: 可以通过调用诸如 `addFirst(E e)` 或者 `offerLast(E e)` 来分别往头部或者尾部追加新成员;同样地有对应的移除函数比如 `removeFirst()` / `pollLast()`. - **模拟堆栈行为**: 支持像 LIFO(Last In First Out)这样的逻辑处理方式, 如利用 push/pop 方法完成入栈/出栈动作. 这些高级特性的存在让开发者能够更加灵活高效地管理内存空间内的对象排列顺序[^3]. #### 自定义实现的理解价值 深入研究自定义版本的 `LinkedList` 不仅能加深对于内部机制的认识,而且有助于掌握面向对象设计原则及其应用技巧。例如,尝试模仿标准库的设计思路去构建自己的容器组件可以帮助巩固基础概念的同时提升编码能力[^4]. #### 性能考量对比其他容器类型 当涉及到具体应用场景的选择时,应该考虑到不同容器之间的性能差异。相比于同属 List 接口下的 ArrayList ,由于后者采用的是连续分配的大块内存区域来进行元素存放的方式,因此在随机访问方面表现更优;然而一旦遇到大量动态调整大小的需求,则前者可能因为每次变动都需要重新定位指针而显得效率低下。相反,如果项目里经常涉及大量的中间位置的数据变更任务,那么显然更适合选用具备快速插入删除优势的 LinkedList 类型[^5].
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值