LinkedList的底层实现

本文深入解析了Java中LinkedList的实现原理及其作为双端队列的操作方法。对比ArrayList,LinkedList在插入和删除操作上更为高效,但随机访问较慢。文章详细介绍了LinkedList的主要方法,如offer、poll等。

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

 

public class LinkedList<E>

    extends AbstractSequentialList<E>

    implements List<E>, Deque<E>, Cloneable, java.io.Serializable

public interface Deque<E> extends Queue<E>

其实是双端队列

 

 

实现原理

List接口的链表实现,并提供了一些队列,栈,双端队列操作的方法

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;

        }

    }

ArrayList对比,LinkedList插入和删除操作更加高效,随机访问速度慢

可以作为栈、队列、双端队列数据结构使用;

非同步,线程不安全;

ArrayList、Vector一样,LinkedList的内部迭代器存在“快速失败行为”;

支持null元素、有顺序、元素可以重复

 

实现的Deque接口

双端队列

双端队列是指允许两端都可以进行入队和出队操作的队列,其元素的逻辑结构仍是线性结构。将队列的两端分别称为前端和后端,两端都可以入队和出队。

 

 

其实是间接实现Queue接口

主要的方法:

boolean offer(E e);

将对象e插入队列尾部,成功返回true,失败(没有空间)返回false;

E poll();

获取并移除队列头部元素,如果队列为空,返回null;

E peek();

获取但不移除队列头部元素,如果队列为空,返回null;

boolean offerFirst(E e);

将对象e插入到双端队列头部

boolean offerLast(E e);

将对象e插入到双端队列尾部;

 

Poll出队方法操作

public E poll() {

        final Node<E> f = first;

        return (f == null) ? null : unlinkFirst(f);

    }

private E unlinkFirst(Node<E> f) {

        // assert f == first && f != null;

        final E element = f.item;

        final Node<E> next = f.next;

        f.item = null;

        f.next = null; // help GC

        first = next;

        if (next == null)

            last = null;

        else

            next.prev = null;

        size--;

        modCount++;

        return element;

    }

主要实现在unlinkFirst方法内,首先直接获取被删节点,临时存储其具体引用的对象element和下个引用next,然后将被删节点对象引用和下个节点引用置null给gc回收,改变双端队列队头结点为被删节点的下个引用next,如果next为空,将双端队列的队尾结点last置null,否则将next节点的前引用置null;队列长度减减,操作次数加加(快速失败机制,参考HashMap),返回被删节点引用的具体对象

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值