源码分析之LinkedList

本文详细介绍了Java LinkedList数据结构的原理、特点、实现方式以及使用注意事项。重点探讨了双向链表的数据结构、LinkedList类的成员属性、操作方法,并分析了其在查询、迭代、插入和删除等操作上的性能表现。此外,还强调了LinkedList作为队列使用的特性,以及如何在多线程环境下安全地使用LinkedList。本文旨在帮助开发者深入理解LinkedList的内部工作原理,以便在实际项目中灵活运用。

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

源码分析之LinkedList

1、概述

LinkedList是基于双向链表实现的一种数据结构,其特点是插入和删除元素非常的方便(常数级算法操作)。


2、数据结构

双向链表图


3、LinkedList部分源码展示

LinkedList层次结构和成员属性

public class LinkedList<E>
extends AbstractSequentialList<E>
implements List<E>, Deque<E>, Cloneable, java.io.Serializable
{
    //集合容器元素个数
    transient int size = 0;
    //头节点
    transient Node<E> first;
    //尾节点
    transient Node<E> last;

    //备注:链表数据结构不存在大小限制不存在扩容的说法。
}

Node数据结构

private static class Node<E> {
    E item;//元素数据内容
    Node<E> next;//下一个节点
    Node<E> prev;//上一个节点

    Node(Node<E> prev, E element, Node<E> next) {
        this.item = element;
        this.next = next;
        this.prev = prev;
    }
}

备注:
LinkedList实现了Deque(双端队列),所以其可以用来做队列数据结构使用。

说明:
LinkedList操作方法比较多,这里就不展示代码说明,但是总之其链表数据结构决定其大部分操作都是基于移动前驱和后继的引用来实现的。


4、注意说明

1、LinkedList继承和实现体系(实现了List、Deque ... )
2、LinkedList的成员属性Node(注意transient修饰的属性,不被序列化)
3、LinkedList不存在扩容这么一说,因为其在物理内存存储不是连续存储的。数组是占据连续内存块的。
4、LinkedList查询和迭代不太方便,因为其链表结构使其每次只能从一端开始一个一个节点的查询比较,
但其链表的结构使其插入和删除的效率非常的高(只需要改变某个节点的前驱和后继的指针指向即可)
5、LinkedList的特有迭代器是双向的,但是并没什么卵用,我几乎没用过
6、迭代LinkedList对象时,如果使用对象修改数据的时候会出现ConcurrentModificationException(
fail- fast快速失败机制),推荐使用迭代器来修改数据
7、由于其实现的Deque双端队列,有些场景下可以使用LinkedList作为队列实现
8、由于java.util下的集合不是并发集合所以当在多线程编程时,推荐使用并发包下的集合对象,或使用Collections.
synchronizedCollection(x extends Collection);
备注:当业务是频繁插入和删除操作时,推荐使用LinkedList对象(插入删除迅速)
其实LinkedList的源码实现是比较简单的,也就只涉及到链表数据结构
自己应该要实现链表数据结构,加深理解。

总结:

LinkedList是基于双向链表实现的一种数据结构,其插入和删除操作非常的迅速,但是对于查询操作其需要从头开始遍历,所以查询操作效率比较低。在某些场景下使用LinkedList是很不错的选择。由于LinkedList已经实现了队列功能所以其可以用来当做队列使用


参考

  1. http://beginnersbook.com/2014/08/java-linkedlist-class/
  2. http://www.cnblogs.com/leesf456/p/5308843.html
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值