【Java集合】LinkedList

概要

LinkedList是用链表结构存储数据的,很适合数据的动态插入和删除,随机访问速度比较慢。另外,他还提供了 List 接口中没有定义的方法,专门用于操作表头和表尾元素,可以当作堆栈、队列和双向队列使用。

链表

链表是线性表的常见实现。它由一系列节点(Node)组成,Node是LinkedList的一个内部类,有三个属性:item存储数据,next指向下一个节点的指针,prev指向上一个节点的指针,所以LinkedList是由双向链表实现的。

复制代码
private static class Node<E> {
    E item;
    LinkedList.Node<E> next;
    LinkedList.Node<E> prev;
}

基本操作

LinkedList提供了一系列基本操作,包括添加元素、删除元素、查找元素、获取元素等。如:

|------------------|-------------|
| add(E e) | 在链表末尾添加一个元素 |
| addFirst(E e) | 在链表开头添加一个元素 |
| addLast(E e) | 在链表末尾添加一个元素 |
| remove() | 删除链表的第一个元素 |
| remove(Object o) | 删除链表中指定的元素 |
| removeFirst() | 删除链表的第一个元素 |
| removeLast() | 删除链表的最后一个元素 |

作为栈使用

LinkedList可以作为栈使用,内部提供了push()和pop()方法用于入栈和出栈,还有peek()方法用于探测栈顶元素,不过作为LinkedList的副业,用户需自己遵守栈的规则,而不像Stack那样具有强制性。那为什么不直接使用Stack呢?理由是如果你已经有一个LinkedList了,为什么要费力把它转成Stack呢,另外,Stack是一个遗留类,它继承自Vector,是线程安全的,但是性能较低,已不推荐在新代码中使用。

作为队列使用

LinkedList可以作为队列使用,内部提供了offer()和poll()方法用于入队和出队,与作为栈使用的理由一样,也是方便开发者使用,若需要创建一个队列,应该使用ArrayDeque。

注意事项

  • LinkedList可以在任意位置高效地添加、删除元素,不需要移动其他元素,不用考虑扩容问题。缺点是查找元素时需要遍历,效率较低。
  • 不要因为节省空间而选择LinkedList,ArrayList虽然数组后面可能会存在空间浪费的情况,但是组成LinkedList的每个节点也有两个指针的额外开销,所以不见的就比ArrayList更节省空间,应该根据需求选择合适的数据结构。
  • LinkedList不是线程同步的,多线程共用需做好同步。
相关推荐
坐吃山猪5 分钟前
【多线程】ThreadPool线程池参数说明
java·网络
evans在进步35 分钟前
Java 常用设计模式(二):装饰器、适配器、责任链、模板方法、策略与观察者
java·开发语言·设计模式
jvmind_dev1 小时前
频繁 new JedisCluster 之后,对象池为什么回不去了?
java·后端
AKA__Zas1 小时前
文件 I/O(速通版
java·intellij-idea·学习方法
学长毕业设计1 小时前
基于SpringBoot的咖啡馆管理系统的设计与实现(源码+文档+讲解视频)
java·spring boot·后端
骇客野人1 小时前
SpringBoot业财一体化系统设计和落地实施方案
java·spring boot·后端
学长毕业设计1 小时前
基于SpringBoot的教学资源推荐系统的设计与实现(源码+文档+讲解视频)
java·spring boot·后端
名字还没想好☜1 小时前
Java Cleaner 实战:替代废弃的 finalize() 做堆外资源清理,以及强引用导致永不回收的坑
java·后端·spring
LaughingZhu1 小时前
Product Hunt 每日热榜 | 2026-09-02
java·ide·intellij-idea
旧梦95271 小时前
Java EnumMap 详解:原理、用法与实战
java·开发语言