Java中ArrayList和LinkedList的性能分析
ArrayList
和LinkedList
是Java集合框架中经常使用的类。如果你只知道从基本性能比较ArrayList
和LinkedList,
那么请仔细阅读这篇文章。
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的性能分析的更多相关文章
- Java中arraylist和linkedlist源代码分析与性能比較
Java中arraylist和linkedlist源代码分析与性能比較 1,简单介绍 在java开发中比較经常使用的数据结构是arraylist和linkedlist,本文主要从源代码角度分析arra ...
- Java中ArrayList与LinkedList的区别
Java中ArrayList与LinkedList的区别 一般大家都知道ArrayList和LinkedList的区别: 1. ArrayList的实现是基于数组,LinkedList的实现是基于双向 ...
- java中ArrayList 和 LinkedList 有什么区别
转: java中ArrayList 和 LinkedList 有什么区别 ArrayList和LinkedList都实现了List接口,有以下的不同点:1.ArrayList是基于索引的数据接口,它的 ...
- Java中ArrayList和LinkedList差别
一般大家都知道ArrayList和LinkedList的大致差别: 1.ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构. 2.对于随机訪问get和set.A ...
- Java中ArrayList和LinkedList区别 时间复杂度 与空间复杂度
一般大家都知道ArrayList和LinkedList的大致区别: 1.ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构. 2.对于随机访问 ...
- Java中ArrayList和LinkedList区别、ArrayList和Vector的区别
一般大家都知道ArrayList和LinkedList的大致区别: 1.ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构. 2.对于随机访问get和set,Ar ...
- JAVA中ArrayList与LinkedList的区别以及对应List使用foreach与使用下标遍历的效率问题
近期在做一个对接京东的电商平台,所以对各个地方的效率考虑的比较多,今天深挖了一下ArrayList与LinkedList的区别以及对应List使用foreach与使用下标遍历的效率问题,首先说一下两种 ...
- java中ArrayList、LinkedList、Vector的区别
ArrayList.LinkedList.Vector这三个类都实现了List接口. ArrayList是一个可以处理变长数组的类型,可以存放任意类型的对象.ArrayList的所有方法都是默认在单一 ...
- Java中ArrayList和LinkedList的异同
一:ArrayList和LinkedList的大致区别如下: 1.ArrayList是实现了基于动态数组的数据结构,ArrayList实现了长度可变的数组,在内存中分配连续的空间.遍历元素和随机访问元 ...
随机推荐
- 【LeetCode】347-前K个高频元素
题目描述 给定一个非空的整数数组,返回其中出现频率前 k 高的元素. 示例 1: 输入: nums = [1,1,1,2,2,3], k = 2 输出: [1,2] 示例 2: 输入: nums = ...
- IDEA中自动导包快捷键
1.File-->Settings 2.解释: 勾选标注第1个选项,IntelliJ IDEA 将在我们书写代码的时候自动帮我们导入需要用到的包.但是对于那些同名的包,还是需要手动 Alt + ...
- 小白学习VUE第一篇文章---如何看懂网上搜索到的VUE代码或文章---使用VUE的三种模式:
小白学习VUE第一篇文章---如何看懂网上搜索到的VUE代码或文章---使用VUE的三种模式: 直接引用VUE; 将vue.js下载到本地后本目录下使用; 安装Node环境下使用; ant-desig ...
- 百度地图WEB端判断用户是否在网格范围内
在pc端设置商家的配送范围,用户在下单时,根据用户设置的配送地点判断是否在可配送范围内,并给用户相应的提示. 下面说下我的实现思路: 1.用百度地图在PC端设置配送范围,可拖拽选择 2.根据用户设置的 ...
- Apollo源码解析-搭建调试环境
准备工作 本地运行时环境 JDK :1.8+ MySQL :5.6.5+ Maven :3.6.1 IDE :IntelliJ IDEA Apollo的表结构对timestamp使用了多个defaul ...
- 今天遇到 Request failed: method not allowed (405)。 错误,特此在网上翻了翻
Q1: 遇到405请求错误.提示:NSLocalizedDescription=Request failed: method not allowed (405).解决方案:405请求方法不被允许.这时 ...
- 亮剑.NET学习札记
学习前提要: 因为书的版本过老,有些章节不学了,要学的包括以下章节 暂定:1,2,4,5,6,7,9,10,11,12,13,14,15,16,17,18,附录A 第一章:主要是介绍.NET,包括面向 ...
- java.lang.IllegalArgumentException: System memory 259522560 must be at least 471859200.
报错信息 java.lang.IllegalArgumentException: System memory 259522560 must be at least 471859200. Please ...
- [Linux] telnet 具体到某个端口Connection refused
可以参考这个链接:https://q.cnblogs.com/q/106337/
- event.stopPropagation()、event.preventDefault()与return false的区别
做小demo时经常用到return false来取消默认事件,但一直不是很懂它和preventDefault()等的区别,今天查了查文档和大神们的博客,在这里对相关知识点做一个总结 首先开门见山,总结 ...