LinkedList基本原理,与ArrayList的区别

Java中对比Vector, ArrayList, LinkedList的区别 创作不易,请大家多多支持。我们在日常的工作中,能够高效地管理和操作数据是非常重要的。由于每个编程语言支持的数据结构不尽相同,比如我最早学习的 C语言,需要自己实现很多基础数据结构,管理和操作会比较麻烦。相比之下,Java 则要方便的多,针对通用场景的需求,Java提供了强大的集合框架,大大提高了开发者的生产力。今天我要问你的是有关集合框架方面的问题,对比Vector、ArrayList、LinkedList 有何区别? 阅读详情

1、LinkedList基本原理

       LinkedList是一个双向链表,底层基于链表实现,链表内存是散乱的,每一个元素存储本身内存地址的同时还存储上一个元素节点、下一个元素节点信息等。其源码结构如下:

   /**
     * Pointer to last node.
     * Invariant: (first == null && last == null) ||
     *上一个节点信息
     *            (last.next == null && last.item != null)
     */
    transient Node<E> first;

    /**
     * Pointer to last node.
     * Invariant: (first == null && last == null) ||
     *            (last.next == null && last.item != null)
     */下一个节点信息
    transient Node<E> last;

    /**
     * Constructs an empty list.
     */
    public LinkedList() {
    }

    //LinkedList类中的内部类
    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;
        }
    }

从中可知:该链表结构由一个个Node<E>对象连接而成,每一个元素存储本身内存地址的同时还存储上一个元素节点、下一个元素节点信息等

(1)添加元素,源码如下:

    /**
     * Appends the specified element to the end of this list.
     *
     * <p>This method is equivalent to {@link #addLast}.
     *
     * @param e element to be appended to this list
     * @return {@code true} (as specified by {@link Collection#add})
     */
    public boolean add(E e) {
        linkLast(e);
        return true;
    }

    /**
     * 作为最后一个元素链接e。
     */
    void linkLast(E e) {
        //前一个元素节点
        final Node<E> l = last;
        //创建当前元素节点,并将上一元素节点存到当前元素节点中
        final Node<E> newNode = new Node<>(l, e, null);
        //将当前元素节点作为下一个元素节点的前一个节点
        last = newNode;
        if (l == null)
            first = newNode;
        else  //不是首节点,则将当前元素节点信息给前一个元素节点的next值,这样实现了双向链表结构
            l.next = newNode;
        size++;
        modCount++;
    }

(2)根据index索引删除指定位置的元素信息

/**
     * Removes the element at the specified position in this list.  Shifts any
     * subsequent elements to the left (subtracts one from their indices).
     * Returns the element that was removed from the list.
     *
     * @param index the index of the element to be removed
     * @return the element previously at the specified position
     * @throws IndexOutOfBoundsException {@inheritDoc}
     */
    public E remove(int index) {
        checkElementIndex(index);
        return unlink(node(index));
    }
    /**
     * Unlinks non-null node x.
     */
    E unlink(Node<E> x) {
        // assert x != null;
        final E element = x.item;
        final Node<E> next = x.next;
        final Node<E> prev = x.prev;

        if (prev == null) {
            first = next;
        } else {
            prev.next = next;
            x.prev = null;
        }

        if (next == null) {
            last = prev;
        } else {
            next.prev = prev;
            x.next = null;
        }

        x.item = null;
        size--;
        modCount++;
        return element;
    }

从代码可知,根据索引删除步骤如下:

a.根据索引index查询出具体的Node<E>对象

b.引出当前节点对象的上一个节点、下一个节点

c.将前一个节点的next值变为当前节点的下一个节点(prev.next = next)

d.当前节点的下一个节点d的prev值变为当前节点的前一个节点(next.prev = prev)

e.当前节点从链表中脱离出来,内容item设置为null

2、LinkedList与ArrayList的区别

(1)数据结构不同

         LinkedList为双向链表结构,链表内存是散乱的;ArrayList底层为数组方式存储的线性结构,存储结构是有序的

(2)性能方面不同

        a、LinkeList由于使用了链表的结构,因此不需要维护容量的大小。从这点上说,它比ArrayList有一定的性能优势

        b、列表任意位置中增加(删除)元素时,LinkeList只要将指定位置插入(脱离),保存前后元素节点信息,即可实现增加(删除)操作,其效率相对会快;ArrayList是基于数组实现的,而数组是一块连续的内存空间,如果在数组的任意位置插入元素,必然导致在该位置后的所有元素需要重新排列(即重新创建新的数组,重新分配元素位置),因此,其效率相对会比较低。

        c、查询列表集合信息时性能差异:LinkeList(链表内存是散乱的)按序号索引数据需要进行前向或后向遍历查询,效率较低;ArrayList数据结构具有一定的排列顺序(根据索引能直接获取结果arr[i],因为底层为数组,不需要遍历),查询较高

 

ArrayList与LinkedList的区别 List ADT有两种流行的实现方式。 1.ArrayList类提供了List ADT的一种可增长数组的实现。使用ArrayList的有点在于,对get和set的调用花费常数时间。其缺点是新项的插入和现有项的删除代价昂贵,除非变动是在ArrayList的末端是在ArrayList的末端运行。 2.LinkedList类则提供了List ADT的双链表实现。使用LinkedList的优点在于,新 阅读详情

相关推荐

ArrayList 与 LinkedList 的区别

ArrayList和LinkedList的区别主要体现在底层结构、访问性能、增删操作和内存占用上。ArrayList基于数组,内存连续,支持快速随机访问但增删效率较低;LinkedList基于双向链表,内存不连续,增删高效但访问需要遍历。ArrayList内存占用较小且能利用CPU缓存局部性原理,而LinkedList需要额外存储指针且无法有效利用缓存。具体选择取决于实际应用场景中对访问和修改操作的需求。

2301_79184547的博客 1268

Java面试:ArrayList和LinkedList 的区别是什么?ArrayList和LinkList的底层实现原理是什么!不懂?小白看我就够了

ArrayList通过数组实现,在随机访问上效率高,但在插入和删除操作中可能需要移动元素。LinkedList通过链表实现,在插入和删除操作上效率高,但随机访问较慢。

GuoFuMengXiang的博客 351

ArrayList和LinkedList的区别

ArrayList和LinkedList的异同点以及使用区别

心若向阳 无谓悲伤 3418

ArrayList和LinkedList的底层原理以及区别(面试直接用)

面试常问JAVA集合知识,Arraylist和LinkedList底层原理和区别

m0_64305105的博客 653

别再一个个BAPI调了!用CVI_EI_INBOUND_MAIN一次性搞定SAP BP主数据(附完整ABAP代码)

本文详细介绍了如何使用SAP标准函数CVI_EI_INBOUND_MAIN高效维护业务伙伴(BP)主数据,替代传统的多BAPI调用方式。通过完整ABAP代码示例,展示了如何一站式处理供应商、客户、公司代码等所有视图的创建与更新,提升数据一致性和开发效率。

weixin_29204205的博客 298

反相器(inverter)和缓冲器(buffer)---附加与非门原理图

下面是对反相器(Inverter)和缓冲器(Buffer)从面积、驱动能力、时序等多个角度的详细对比,列出的是一般情况下的比较,具体情况可能会受到工艺节点、设计库和特定设计要求的影响。缓冲器(Buffer)是数字电路中常见的逻辑门之一,用于增强信号的驱动能力,而不改变信号的逻辑状态。如下图所示的CMOS反相器,由一个NMOS和PMOS组成,栅端gate相连作为输入端Vin,漏端相连作为输出端Vout,NMOS的源端接地,PMOS的源端接电源VDD.与反相器不同,缓冲器的输出与输入保持相同的逻辑状态。

hzmscut的博客 1万+

【Java基础】ArrayLsit 和 LinkedList区别、底层原理以及扩容算法

【Java基础】ArrayLsit 和 LinkedList区别、底层原理以及扩容算法。

Money、坤的博客 718

利用OrthoFinder做泛基因家族聚类分析

这条命令会将 Arabidopsis_thaliana.TAIR10.59_longest_trans.pep.fa 文件中的所有序列ID,去掉ID中的空格后面的部分,只保留 > 后第一个空格之前的基因ID,并将结果保存在 An1.fasta 文件中。muscle 是一种常用的多序列比对工具,用于基因组或蛋白质序列的比对。基因家族(Gene family),是来源于同一个祖先,由一个基因通过基因重复而产生两个或更多的拷贝而构成的一组基因,它们在结构和功能上具有明显的相似性,编码相似的蛋白质产物。

qq_64400864的博客 2755

深入List集合:ArrayList与LinkedList的底层逻辑与区别

ArrayList是一种高效且灵活的动态数据结构,在多个应用场景中都表现出色。从简单的动态数组存储到复杂的对象集合管理,再到作为方法参数和返回值传递或返回一组数据,ArrayList都能提供高效且直观的解决方案。通过理解ArrayList的工作原理和应用场景,我们可以更好地利用这种数据结构来解决实际问题。

李四维的博客账号 1965

力科PCIE协议分析仪summit T3-8使用指南

力科PCIE协议分析仪summit T3-8使用指南

wq897387的专栏 2007

用AI科研绘图全新升级!借助谷歌新发布模型Nano Banana pro实测一键绘制机制图与技术路线图,直接告别文字乱码与低画质

之前有同仁反馈,用Nano Banana画科研插图的时候,要么文字部分容易乱码,要么抓不住关键内容,画出来的效果反复修改后,还是达不到理想的效果。终于在Gemini 3发布没几天,万众期待的大香蕉模型也成功升级到了Pro版本,官方名称叫“Gemini 3 Pro Image”,实际上也就是我们说的Nano Banana 2。这次的Nano Banana Pro模型,不仅可以直出4K高清图,还能自定义比例,推理能力和中文文字的稳定性也得到了提升。

智能AI让学术科研更容易 1890

【Java】ArrayList 和 LinkedList 的区别是什么?

ArrayList和LinkedList作为java开发中常用的两个集合类型,本篇文章主要来谈谈二者的原理与区别。

DreamSun的博客 760

RuoYi-Cloud-Plus使用minio进行文件上传图片后无法预览解决_修改minio配置minio桶权限---SpringCloud工作笔记198

在文件管理的位置,发现刚刚上传的图片文件,会显示 预览图片失败 后来经过多方查看,发现是minio的配置的问题。可以看到首先登录RuoYi-Cloud-Plus系统然后,打开文件管理页面可以看到,当上传了图片文件以后。登录以后,选中左侧Buckets,可以看到有自己用的桶,找到以后点击打开。显示文件展示中,文件预览失败,那么这个时候,去修改minio的配置。可以看到,点击配置管理,这里我们启用的是minio对吧。默认是没有配置的这个时候,是允许下载,但不允许预览的.

添柴程序猿的专栏 5569

Java中Hashset、HashMap、ArrayList、LinkedList、Vector之间的联系与区别

进入正题,HashSet、HashMap、ArrayList、LinkedList、Vector这几个在Java编程中经常用到,他们之间有很多联系,有很多相通的地方、但也有很多不同。首先java集合类主要由两个接口:Collection和Map.Collection又有子接口:Set、Queue、List.(这些基础的接口关系这里不多说了)      HashSet与HashMap,名字很接

Elina_1992的专栏 525

电路布局中近场耦合问题

开关电源EMC设计中,传导骚扰超标往往源于空间耦合而非参数问题。某案例中,DC-DC模块的非屏蔽电感磁场泄漏耦合到邻近X电容,导致0.5MHz频点超标。通过将X电容移至PCB底层、优化布局保持15mm间距后,问题完全解决。实践证明:EMC设计需注重空间隔离,优先采用屏蔽电感,滤波元件应远离高频磁场区,布局优化比参数调整更有效。这提示工程师需将电磁兼容视为空间问题而不仅是电气问题。

硬核科技 375

【知识图谱】neo4j安装与配置_社区版_2025(附完整安装软件包)

(经历过各种版本NEO4J,遇见杂七杂八的各种问题,也看过非常多很好的教程,特此来分享一下,为大家排排坑。

知识靠谱的博客 2万+

ArrayList 和 LinkedList 的区别

ArrayList 和 LinkedList 的区别 ArrayList基于动态数组实现的非线程安全的集合;LinkedList基于链表实现的非线程安全的集合。 对于随机index访问的get和set方法,一般ArrayList的速度要优于LinkedList。因为ArrayList直接通过数组下标直接找到元素;LinkedList要移动指针遍历每个元素直到找到为止。 新增和删除元素,一...

ConstXiong 4万+

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Java面试:ArrayList 和 LinkedList 的区别是什么?谈谈你对ArrayList和LinkedList的理解

ArrayList是基于动态数组实现的 List,其中元素的索引是基于顺序的。它提供了按索引访问元素的快速方式,适合需要频繁读取元素的场景。ArrayList 和 LinkedList 各有优缺点,选择合适的集合类将直接影响程序的性能和可维护性。了解它们的特性及适用场景可以帮助开发者更有效地管理数据结构,从而优化应用程序的性能。希望本篇博客能够帮助你更好地理解 ArrayList 和 LinkedList,并在未来的项目中作出明智的选择!

智通全网络工作室的博客 2603

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

ArrayList 和LinkedList的区别比较

‌ArrayList和LinkedList的主要区别在于它们的底层数据结构、性能特点以及适用场景。‌ArrayList和LinkedList从名字分析,他们一个是Array(动态数组)的数据结构,一个时Linked(链表)的数据结构,此外,他们两个都是对List接口的实现。前者是数组队列,相当于动态数组;后者为双向链表结构,也可当作堆栈、队列、双端队列。

A_aspectJ的博客 4569

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

JAVA中LinkedList和ArrayList的区别

1.底层数据结构ArrayList:基于动态数组,内存连续储存LinkedList:基于双向链表,节点包含前后指针​2.访问性能​ArrayList:随机访问O(1)(直接索引)LinkedList:随机访问O(n)(需遍历)3.​插入/删除性能​ArrayList:中间/头部操作O(n)(需移动元素)尾部操作O(1)(扩容时O(n))中间操作O(n)(遍历)+O(1)(修改指针)头尾操作O(1)4.​适用场景​优先ArrayList:高频随机访问/尾部操作/内存敏感场景。

imxiaoxin09的博客 1258

ArrayList与LinkedList的两者区别

我们在日常开发中经常会使用到AL 与 LL。 arraylist和linkedlist的区别是:数据结构不同,效率不同,自由性不同,主要控件开销不同。 两者对比: 1、数据结构不同 ArrayList是Array(动态数组)的数据结构,LinkedList是Link(链表)双向链表的数据结构。 2、空间灵活性 ArrayList其实最好需要指定初始容量的(当然有些程序员为了偷懒,根本不会去初始化,这其实对于代码质量低的项目而言是无关紧要的)《1.其实在代码规范里,都要手动设置,只是我们用默认而已,如果公

m0_54850952的博客 8663

Java中ArrayList与LinkedList区别

ArrayList和LinkedList的区别(详解):(同理插入第一个元素,这里就不做描述了,如不懂的,再看一下上面的图)对于数组(即ArrayList),随机访问元素的时间复杂度为O(1),插入元素为O(n)。【圈重点啦】对于链表(即LinkedList),随机访问元素的时间复杂度为O(n);对于链表(即LinkedList),插入第一个元素和最后一个元素时,时间复杂度为O(1);当插入的是中间元素时也是O(n)。

weixin_51594609的博客 8287

ArrayList和Array、LinkedList、Vector 间的区别

内部基于动态数组实现,比 (静态数组) 使用起来更加灵活:以下是两者之间的对比:ArrayList: Array: 二、ArrayList 和 LinkedList 的区别 从以下几个方面来比较:我们在项目中一般是不会使用到 的,需要用到 的场景几乎都可以使用 来代替,并且,性能通常会更好! 补充:双向链表 和 双向循环链表双向链表: 包含两个指针,一个 prev 指向前一个节点,一个 next 指向后一个节点。 双向循环链表: 最后一个节点的 next 指向 head,而 head 的

午夜后是黎明,风雨后是骄阳 1498

ArrayList和LinkedList的区别以及优缺点

ArrayList和LinkedList的区别以及优缺点 (在面试的时候经常会提问,谈一谈以你对ArrayList和LinkedList的区别以及优缺点,今天做一下笔记,方便以后查看,个人理解,不一定正确,若真有错误,请轻喷) 1、ArrayList: ArrayList实现了基于动态数组的数据结构,每个元素在内存中存储地址是连续的,根据下标查询的速度是很快的,向集合元素末尾添加的效率也是非常快...

MoLi的博客 2613
上一篇: ArrayList与Vector源码解析与区别
下一篇: HashMap实现原理与源码解析
Array*
博客等级 码龄9年 2粉丝 19原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值