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. 【LeetCode】79-单词搜索

    题目描述 给定一个二维网格和一个单词,找出该单词是否存在于网格中. 单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中 "相邻" 单元格是那些水平相邻或垂直相邻的单元格.同一 ...

  2. 当React开发者初次走进React-Native的世界

    RN千机变 1.技术体系问题 RN和React共用一套抽象层,相对于前端,RN其实更接近Node的运行环境 ReactNative =React +IOS +Android 看RN文档时,我会发现入门 ...

  3. Spring Cloud(三):声明式调用

    声明式服务调用 前面在使用spring cloud时,通常都会利用它对RestTemplate的请求拦截来实现对依赖服务的接口调用,RestTemplate实现了对http的请求封装处理,形成了一套模 ...

  4. Android图片的缩放效果

    一.概述 Android 图片要实现:手势滑动,双击变大,多点触控的效果. 其实是有一定难度的,我们需要用Matrix ,GestureDetector 等等需要完成一个复杂的逻辑才能实现,然而今天我 ...

  5. 解决SSM框架中,存储到mysql数据库中乱码问题的究极方案

    因为编码格式不匹配的问题,设置了好多遍,都不行,就试着让所有的编码格式保持一致.然后读取.插入数据库再也不乱码了. 数据库编码格式必须和myeclipse编码格式一致 其次依次让以下各文件的编码格式保 ...

  6. 代理损失函数(surrogate loss function)

    Surrogate loss function,中文可以译为代理损失函数.当原本的loss function不便计算的时候,我们就会考虑使用surrogate loss function. 在二元分类 ...

  7. 定义一个Person类,其中包括:1.定义属性:姓名、年龄、民族作为成员变量。定义静态成员变量:人数2.定义构造方法:对成员变量进行初始化。3.定义多个方法:分别显示相应的属性值,例如getName(){System.out.print("名称="+name+";"); }4.定义一个方法“成长”:实现年龄的增加,每执行一次年龄增加1

    题目显示不全,完整题目描述: (1)定义一个Person类,其中包括:1.定义属性:姓名:年龄:民族作为成员变量.定义静态成员变量:人数2.定义构造方法:对成员变量进行初始化.3.定义多个方法:分别显 ...

  8. Elastic Stack 笔记(一)CentOS7.5 搭建 Elasticsearch5.6 集群

    博客地址:http://www.moonxy.com 一.前言 Elasticsearch 是一个基于 Lucene 的分布式搜索引擎服务,采用 Java 语言编写,使用 Lucene 构建索引.提供 ...

  9. Linux 笔记 - 第七章 Vi 和 Vim 编辑器

    博客地址:http://www.moonxy.com 一.前言 Vi 与 Vim 都是多模式编辑器,是 Linux 中必不可少的工具.不同的是 Vim 是 Vi 的升级版本,它不仅兼容 Vi 的所有命 ...

  10. jmeter性能分析

    1.硬件要求:包括客户端和服务端的cpu,mem,network,disk等,这些硬件设备必须满足性能测试的前提下,才能进行性能测试,否则得到的各项指标不一定是正确的 2.场景分析: 测试前的准备工作 ...