ArrayList和LinkedList的区别、优缺点以及应用场景

ArrayList和LinkedList的区别、优缺点以及应用场景ArrayList 和 LinkedList 都是实现了 List 接口的容器类 用于存储一系列的对象引用 他们都可以对元素的增删改查进行操作 那么他们区别 优缺点应用场景都有哪些呢 我们通过源码和数据结构来说明一下 ArrayList 和 LinkedList 的大致区别如下 ArrayList 是实现了基于动态数组的数据结构 LinkedList 是基于链表结构 对于随机访问的 get 和 set 方法 Array

ArrayList和LinkedList都是实现了List接口的容器类,用于存储一系列的对象引用。他们都可以对元素的增删改查进行操作,那么他们区别、优缺点应用场景都有哪些呢?我们通过源码和数据结构来说明一下

ArrayList和LinkedList的大致区别如下:

  1. ArrayList是实现了基于动态数组的数据结构,LinkedList是基于链表结构。
  2. 对于随机访问的get和set方法,ArrayList要优于LinkedList,因为LinkedList要移动指针。
  3. 对于新增和删除操作add和remove,LinkedList比较占优势,因为ArrayList要移动数据。
具体说明
ArrayList源码:

在这里插入图片描述
在源码中可看到,ArrayList是实现了基于动态数组的数据结构,而数组是一段连续的内存空间,在内存中我们可以简单表示为下图样式
在这里插入图片描述
因为数组在存储数据时是按顺序存储的,存储数据的内存也是连续的,所以他的特点就是寻址读取数据比较容易,插入和删除比较困难。简单解释一下为什么,在读取数据时,只需要告诉数组要从哪个位置(索引)取数据就可以了,数组会直接把你想要的位置的数据取出来给你。插入和删除比较困难是因为这些存储数据的内存是连续的,要插入和删除就需要变更整个数组中的数据的位置。举个例子:一个数组中编号0->1->2->3->4这五个内存地址中都存了数组的数据,但现在你需要往4中插入一个数据,那就代表着从4开始,后面的所有内存中的数据都要往后移一个位置,这可是很耗时的。
所以,对于ArrayList,它在集合的末尾删除或添加元素所用的时间是一致的,但是在列表中间的部分添加或删除时所用时间就会大大增加。但是它在根据索引查找元素的时候速度很快。








LinkedList部分说明:

LinkedList底层是双向列表

// 双向链表的节点所对应的数据结构。 // 包含3部分:上一节点,下一节点,当前节点值。 private static class Entry<E> { 
    // 当前节点所包含的值 E element; // 下一个节点 Entry<E> next; // 上一个节点 Entry<E> previous; / * 链表节点的构造函数。 * 参数说明: * element —— 节点所包含的数据 * next —— 下一个节点 * previous —— 上一个节点 */ Entry(E element, Entry<E> next, Entry<E> previous) { 
    this.element = element; this.next = next; this.previous = previous; } } 

当需要在首位置插入元素时,first 引用指向需要插入到链表中的节点对象,新的节点对象的next引用指向原先的首节点对象;

所以,对于LinkedList,它在插入、删除集合中任何位置的元素所花费的时间都是一样的,但是它根据索引查询一个元素的时候却比较慢。

ArrayList和LinkedList的缺点如下:

  1. 对ArrayList和LinkedList而言,在列表末尾增加一个元素所花的开销都是固定的。对ArrayList而言,主要是在内部数组中增加一项,指向所添加的元素,偶尔可能会导致对数组重新进行分配;而对LinkedList而言,这个开销是 统一的,分配一个内部Entry对象。
  2. 在ArrayList集合中添加或者删除一个元素时,当前的列表移动元素后面所有的元素都会被移动。而LinkedList集合中添加或者删除一个元素的开销是固定的。
  3. LinkedList集合不支持 高效的随机随机访问(RandomAccess),因为可能产生二次项的行为。
  4. ArrayList的空间浪费主要体现在在list列表的结尾预留一定的容量空间,而LinkedList的空间花费则体现在它的每一个元素都需要消耗相当的空间

ArrayList和LinkedList的应用场景如下:

ArrayList使用在查询比较多,但是插入和删除比较少的情况,而LinkedList用在查询比较少而插入删除比较多的情况

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/211811.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月18日 下午9:33
下一篇 2026年3月18日 下午9:33


相关推荐

  • Springboot面试题一

    Springboot面试题一Springboot面试题一一什么是springboot的stater,能干什么?二Springboot自动装配的原理三SpringBoot有几种读取配置文件的方式?四Springboot全局异常处理一什么是springboot的stater,能干什么?starter是一种服务,使用某个功能的开发者不需要关注各种依赖库的处理,不需要具体的配置信息,由SpringBoot自动通过classpath路径下的类发现并加载需要的Bean。背景:在没有使用各个starter之前,我们搭

    2022年5月23日
    56
  • iOS 开发-理解Certificate、AppId和Provisioning Profile

    iOS 开发-理解Certificate、AppId和Provisioning Profile之前被证书折腾的死去活来的 现在懂了点 mark 下一些相关知识

    2026年3月19日
    3
  • 个人整理的一些net 开源项目

    个人整理的一些net 开源项目net开源商城:BrnMall地址 http://www.brnshop.com/ 技术架构很不错;官方提供技术支持,有博客有视频介绍;官方技术博客:http://www.cnblogs.com/wheretime/官方视频下载地址:http://pan.baidu.com/s/1dDCKQXj真乃业界良心之作;风格和天猫京东各大商城接近;后台都很好;

    2022年7月15日
    16
  • 版本过低怎么升级_手机版本出现问题怎么办

    版本过低怎么升级_手机版本出现问题怎么办昨天心血来潮更新了下Eclipse下的SDK,但是由于网速、时间等原因,没有全部更新完。1、打开Eclipse的时候,提示ThisAndroidSDKrequiresAndroidDeveloperToolkitversion23.0.0orabove.Currentversionis22.6.2.v201403212031-1085508.Pleaseup

    2025年6月29日
    5
  • 利用UCSC Xena做TCGA数据库的生存曲线分析

    利用UCSC Xena做TCGA数据库的生存曲线分析利用 UCSCXena 做 TCGA 数据库的生存曲线分析 UCSC 的分析入口打开 UCSCXena 网站 UCSCXena 网页速度可能不太稳定 点击界面的 GETSTARTED 在打开的界面右上角点 LaunchXenaBr 界面如图 进入分析界面 利用 UCSC 分析 TCGA 数据库中乳腺癌样品在 serchastudy 中选择 TCGABreastCa BRCA

    2026年3月17日
    3
  • c/c++ 静态代码检查工具

    c/c++ 静态代码检查工具静态代码检查

    2026年3月18日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号