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实现了长度可变的数组,在内存中分配连续的空间.遍历元素和随机访问元 ...
随机推荐
- java多线程之ScheduleThreadPoolExecutor
ScheduledThreadPoolExecutor 介绍 ScheduledThreadPoolExecutor 是一个可以实现定时任务的 ThreadPoolExecutor(线程池).比 ...
- JAVA集成JPush
本篇集成为web项目手动集成JPush 一.获取AppKey.Master Secret https://docs.jiguang.cn 成为极光用户创建一个应用拿到(AppKey.Master Se ...
- Java连载30-方法重载、方法递归
一.方法重载 1.又被称为overload 2.方法重载使用场景 功能类似的时候,尽可能仍方法名相同(但是功能不同或者不相似的时候,方法名尽量不同) 3.什么条件满足之后,可以构成方法重载 (1)在同 ...
- JS权威指南需要注意的知识点(1-6章)
客官快来看一看了,都给你浓缩好了,确定不进来搂一眼嘛,走过路过不要错过哟 in运算符 in运算符希望它的左操作数是一个字符串或可以转化为字符串,希望它的右操作数是一个对象,如果右侧的对象拥有一个名为左 ...
- 54 (OC)* 网络七层架构
一:TCP/IP协议 二:七层协议 1:物理层 物理层为设备之间的数据通信提供传输媒体及互连设备,为数据传输提供可靠的环境. 1.1:传输媒体和互连设备 物理层的媒体包括架空明线.平衡 ...
- vue入门之创建第一个实例,挂载点、模板和实例之间的关系
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- select2 分组后的选项无法被选中
在使用select2组件的过程中发现分组下的选项无法选中,与分组在同一级的选项可以被选中! 1.所用select2版本select2-4.0.32 2.HTML代码: <input id=&qu ...
- Intellij IDEA 2019 + Java Spring MVC + Hibernate学习笔记(1)
之前的技术栈一直是围绕.net 做的,现在.net 技术栈的使用越来越少,越来越窄.好多原来的同事都转Java开发了. 最近公司变动,自己需要重新找个坑,压力山大.好多要求Java技术栈的根本没机会进 ...
- 品Spring:bean工厂后处理器的调用规则
上一篇文章介绍了对@Configuration类的处理逻辑,这些逻辑都写在ConfigurationClassPostProcessor类中. 这个类不仅是一个“bean工厂后处理器”,还是一个“be ...
- 深度汉化GCompris-qt,免费的幼儿识字软件
1 需求 因为有个小孩上幼儿园了,想开始教他一些汉语拼音和基本的汉字,但通过一书本和卡片又有些枯燥乏味,于上就上网搜索一些辅助认字的应用,还购买了悟空识字APP,在用的过程中发现他设置了很严格的关卡, ...