ArrayListLinkedList是Java集合框架中经常使用的类。如果你只知道从基本性能比较ArrayListLinkedList,那么请仔细阅读这篇文章。

ArrayList应该在需要更多搜索操作的地方使用,并且LinkedList应该在需要更多插入和删除操作的地方使用。”

ArrayList使用  Array 数据结构,LinkedList使用  DoublyLinkedList 数据结构。在这里,我们要讨论基础数据结构如何影响插入,搜索的性能,以及删除操作  ArrayList 和  LinkedList

下面是使用ArrayList和LinkedList不同操作的示例:

下面我们将比较ArrayList和LinkedList的操作,看哪一个在性能方面更有效。

在最后索引处插入值(块1和2)

当我们在最后一个索引处插入一个值时,ArrayList必须 :

  • 检查基础数组是否已满。
  • 如果数组已满,则将数据从旧数组复制到新数组(大小比旧数组大两倍),
  • 然后在最后一个索引处添加值。

另一方面,LinkedList只是在底层DoublyLinkedList的尾部添加该值。

两者都具有时间复杂度O(1),但是由于在ArrayList中创建新数组的附加步骤,其最坏情况复杂度达到N的顺序,这就是为什么我们更喜欢使用LinkedList.

在给定指数处插入值(第3和第4块)

当我们在给定索引处插入值时,ArrayList必须 :

  • 检查基础数组是否已满。
  • 如果数组已满,则将数据从旧数组复制到新数组(大小为旧数组的两倍)。
  • 之后,从给定索引开始,将值移动一个索引以为新值创建空间。
  • 然后在给定索引处添加值。

另一方面,LinkedList只是通过重新排列底层DoublyLinkedList的指针来查找索引并在给定索引处添加该值。

两者都具有时间复杂度O(N),但是由于在ArrayList中创建新数组并将现有值复制到新索引的附加步骤,我们更喜欢使用LinkedList.

按值搜索(第5和第6块)

当我们在ArrayList或LinkedList中搜索任何值时,我们必须遍历所有元素。该操作具有O(N)时间复杂度。看起来像ArrayList和LinkedList都具有相同的性能。

这里我们需要注意的是,数组(ArrayList的底层数据结构)将所有值存储在连续的内存位置,但是DoublyLinkedList将每个节点存储在一个随机的内存位置。迭代连续内存位置比随机内存位置更具性能效率,这就是为什么我们在按值搜索时更喜欢使用LinkedList而不是LinkedList。

按索引获取元素(第7和第8块)

当我们通过Index获得元素时,ArrayList是一个明显效果更好。

ArrayList可以为您提供O(1)复杂度的任何元素,因为该数组具有随机访问属性。您可以直接访问任何索引而无需遍历整个数组。

LinkedList具有顺序访问属性。它需要迭代每个元素以达到给定的索引,因此从LinkedList通过索引获取值的时间复杂度是O(N)。

按值删除(块9和10)

它类似于在给定索引处添加值。要在ArrayList和LinkedList中按值删除元素,我们需要迭代每个元素以到达该索引,然后删除该值。该操作具有O(N)复杂度。

不同的是,要从LinkedList中删除一个元素,我们只需要修改指针,但是在ArrayList中,我们需要在删除值的索引之后移动所有元素以填充创建的间隙。

由于移位是昂贵的操作然后修改指针,因此即使在相同的总体复杂度O(N)之后,我们更喜欢LinkedList,其中需要更多按值操作删除。

按索引删除(第11和12栏)

为了通过索引删除,ArrayList使用O(1)复杂度中的随机访问来查找该索引,但是在移除元素之后,移位其余元素会导致整体O(N)时间复杂度。

另一方面,LinkedList花费O(N)时间来使用顺序访问来查找索引,但是要删除元素,我们只需要修改指针。

由于移位是比迭代更昂贵的操作,因此如果我们想要逐个删除元素,LinkedList会更有效。

Java中ArrayList和LinkedList的性能分析的更多相关文章

  1. Java中arraylist和linkedlist源代码分析与性能比較

    Java中arraylist和linkedlist源代码分析与性能比較 1,简单介绍 在java开发中比較经常使用的数据结构是arraylist和linkedlist,本文主要从源代码角度分析arra ...

  2. Java中ArrayList与LinkedList的区别

    Java中ArrayList与LinkedList的区别 一般大家都知道ArrayList和LinkedList的区别: 1. ArrayList的实现是基于数组,LinkedList的实现是基于双向 ...

  3. java中ArrayList 和 LinkedList 有什么区别

    转: java中ArrayList 和 LinkedList 有什么区别 ArrayList和LinkedList都实现了List接口,有以下的不同点:1.ArrayList是基于索引的数据接口,它的 ...

  4. Java中ArrayList和LinkedList差别

    一般大家都知道ArrayList和LinkedList的大致差别: 1.ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构.  2.对于随机訪问get和set.A ...

  5. Java中ArrayList和LinkedList区别 时间复杂度 与空间复杂度

    一般大家都知道ArrayList和LinkedList的大致区别:      1.ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构.      2.对于随机访问 ...

  6. Java中ArrayList和LinkedList区别、ArrayList和Vector的区别

    一般大家都知道ArrayList和LinkedList的大致区别: 1.ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构. 2.对于随机访问get和set,Ar ...

  7. JAVA中ArrayList与LinkedList的区别以及对应List使用foreach与使用下标遍历的效率问题

    近期在做一个对接京东的电商平台,所以对各个地方的效率考虑的比较多,今天深挖了一下ArrayList与LinkedList的区别以及对应List使用foreach与使用下标遍历的效率问题,首先说一下两种 ...

  8. java中ArrayList、LinkedList、Vector的区别

    ArrayList.LinkedList.Vector这三个类都实现了List接口. ArrayList是一个可以处理变长数组的类型,可以存放任意类型的对象.ArrayList的所有方法都是默认在单一 ...

  9. Java中ArrayList和LinkedList的异同

    一:ArrayList和LinkedList的大致区别如下: 1.ArrayList是实现了基于动态数组的数据结构,ArrayList实现了长度可变的数组,在内存中分配连续的空间.遍历元素和随机访问元 ...

随机推荐

  1. Spring事务失效的2种情况

    使用默认的事务处理方式 因为在java的设计中,它认为不继承RuntimeException的异常是”checkException”或普通异常,如IOException,这些异常在java语法中是要求 ...

  2. 用OSS给阿里云ECS扩展硬盘容量

    阿里云的虚拟机ECS在创建时可以指定一个云盘,但在使用过程中,随着时间推移数据越来越多,难免硬盘就不够用了.当然你可以在另外加个云盘,不过总还有用完的时候,而且价格也不便宜.今天给大家介绍一个方法,给 ...

  3. 微信小程序点击控制元素的显示与隐藏

    微信小程序点击控制元素的显示与隐藏 首先我们先来看一下单个点击效果 我们来看一下wxml中的代码: <view class="conten"> <view cla ...

  4. Elastic Stack 笔记(十)Elasticsearch5.6 For Hadoop

    博客地址:http://www.moonxy.com 一.前言 ES-Hadoop 是连接快速查询和大数据分析的桥梁,它能够无间隙的在 Hadoop 和 ElasticSearch 上移动数据.ES ...

  5. Ubuntu18.04 显卡驱动+Cuda安装踩坑记录 以及Ubuntu虚拟内存的添加

    前几天买了张亮机卡,终于把主显卡成功直连到Unraid OS的虚拟机上了.然后就开始安装ubuntu系统开始配置环境,遇到了不少坑,特此记录. gcc版本问题 在安装显卡驱动的时候,不要修改gcc版本 ...

  6. java selenium 自动化笔记-不是0基础,至少有java基础

    本来今天要学GitHub的,但是在群里问了下小伙伴时被暴击.说我学的东西太多太杂,不是很深入,都是皮毛.哎~自己早深有意识到,因个人能力吧,找的资料都不是很全,加上实际工作没有应用到.所以写一篇sel ...

  7. Maven 梳理 -scope属性

    在POM 4中,<dependency>中还引入了<scope>,它主要管理依赖的部署.目前<scope>可以使用5个值: * compile,缺省值,适用于所有阶 ...

  8. 【SQL server】SQL Server 触发器

    触发器是一种特殊类型的存储过程,它不同于之前的我们介绍的存储过程.触发器主要是通过事件进行触发被自动调用执行的.而存储过程可以通过存储过程的名称被调用. Ø 什么是触发器 触发器对表进行插入.更新.删 ...

  9. 【ADO.NET-中级】百万级数据的批量插入的两种方法测试

    在SQL Server 中插入一条数据使用Insert语句,但是如果想要批量插入一堆数据的话,循环使用Insert不仅效率低,而且会导致SQL一系统性能问题.下面介绍SQL Server支持的两种批量 ...

  10. uC/OS-III 时间管理(二)

    时间管理就是一种建立在时钟节拍上,对操作系统任务的运行实现时间上管理的一种系统内核机制. 常用以下五个函数: OSTimeDly() OSTimeDlyHMSM() OSTimeDlyResume() ...