LinkedList与ArrayList的比较

1.LinkedList

  1. 基于双向链表,无需连续内存

  2. 随机访问慢(要沿着链表遍历)

  3. 头尾插入删除性能高

  4. 占用内存多

2.ArrayList

  1. 基于数组,需要连续内存

  2. 随机访问快(指根据下标访问)

  3. 尾部插入、删除性能可以,其它部分插入、删除都会移动数据,因此性能会低

  4. 可以利用 cpu 缓存,局部性原理

3.查询比较

        在图上可以看到,ArrayList是内存地址是连续的,而LinkedList不是连续的,通过当前节点保存的下一个节点的位置(LinkedList底层是基于双向链表实现的)。所以,ArrayList 的随机读取速度快,而LinkedList需要一个一个的向后遍历知道遍历到所需元素。

public class ArrayList<E> extends AbstractList<E>implements List<E>, RandomAccess, Cloneable, java.io.Serializable{}
public class LinkedList<E>extends AbstractSequentialList<E>implements List<E>, Deque<E>, Cloneable, java.io.Serializable{}

        可以发现,ArrayList实现了RandomAccess接口,代表了ArrayList支持随机访问。这个接口的作用仅仅是一个标记,当使用到ArrayList时,Java的底层类库发现了RandomAccess接口,就说明可以支持根据索引随机访问存储,否则就只能使用迭代器进行遍历。

为什么要使用可序列化

这里有一个小知识点,也就是我们经常可以看到一些类中实现了可序列化接口Serializable

序列化:将 Java 对象转换成字节流的过程。

反序列化:将字节流转换成 Java 对象的过程。

当 Java 对象需要在网络上传输 或者 持久化存储到文件中时,就需要对 Java 对象进行序列化处理。

序列化的实现:类实现 Serializable 接口,这个接口没有需要实现的方法。实现 Serializable 接口是为了告诉 jvm 这个类的对象可以被序列化。

注意事项:

某个类可以被序列化,则其子类也可以被序列化
声明为 static 和 transient 的成员变量,不能被序列化。static 成员变量是描述类级别的属性,transient 表示临时数据
反序列化读取序列化对象的顺序要保持一致

4.增删比较

        我们通常说ArrayList增删慢、查询快,LinkedList增删快、查询慢。其实这种说法仅仅是在初学的时候加强记忆用的,并不是完全准确的。我们说查询,是根据元素的内容去查找元素的位置,如果是使用从头往后遍历的话,ArrayList和LinkedList的时间复杂度是相同的。

        ArrayList在中间位置添加新元素时,会把当前位置和位置后边的所有元素复制一份,然后向后移动一位,再将新元素插入进去。越靠近头部插入,需要移动的元素越多,也就越影响性能。

  • 在头部插入时,ArrayList比LinkedList慢(ArrayList需要复制元素
  • 在尾部插入时,ArrayList比LinkedList快(差不多,略快
  • 在中间插入时,ArrayList比LinkedList快的多!!!

        这个时候我们会想,在中间插入的时候,链表不应该比数组插入快的多吗?为什么会出现这样的情况。因为在中间部分插入时,首先要寻找到这个地方。而ArrayList是支持随机访问的!LinkedList则只能一个一个遍历到中间位置所以消耗的时间也就越多。

        所以我们一般使用ArrayList而LinkedList使用的较少。

5.空间占用

        ArrayList可以利用 cpu 缓存,局部性原理来加快计算效率,而LinkedList因为不是一片连续的内存,所以不能使用,而且LinkedList占用的内存多(其中每个节点需要存储前后节点的位置)。

private static class Node<E> {E item;Node<E> next;Node<E> prev;Node(Node<E> prev, E element, Node<E> next) {this.item = element;this.next = next;this.prev = prev;}}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/592531.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

面试算法84:包含重复元素集合的全排列

题目 给定一个包含重复数字的集合&#xff0c;请找出它的所有全排列。例如&#xff0c;集合[1&#xff0c;1&#xff0c;2]有3个全排列&#xff0c;分别是[1&#xff0c;1&#xff0c;2]、[1&#xff0c;2&#xff0c;1]和[2&#xff0c;1&#xff0c;1]。 分析 下面采用回溯…

从0搭建github.io网页

点击跳转到&#x1f517;我的博客文章目录 从0搭建github.io网页 文章目录 从0搭建github.io网页1.成果展示1.1 网址和源码1.2 页面展示 2.new对象2.1 创建仓库 3.github.io仓库的初始化3.1 千里之行&#xff0c;始于足下3.2 _config.yml3.3 一点杂活 4.PerCheung.github.io.p…

如何为开源项目和社区做贡献 -- 你应该知道的十件事(四)——如何创建自己的开源项目?

问题四&#xff1a;如何创建自己的开源项目&#xff1f; 在前文中&#xff0c;我们已经介绍了最常见的给开源项目做贡献的两种途径&#xff0c;但随着你做开源项目的深入&#xff0c;你可能就会发现一个新的方向并推出自己的开源项目&#xff0c;下面&#xff0c;我将结合我的讲…

Linux 命令echo

命令作用 输出一行字符串在shell中&#xff0c;可以打印变量的值输出结果写入到文件在显示器上显示一段文字&#xff0c;起到提示的作用 语法 echo [选项] [字符串] 参数 字符含义-n不自动换行-e解释转义字符-E不解释转义字符 如果-e有效&#xff0c;则识别以下序列&…

SpringBoot 项目如何生成 swagger 文档

推荐使用 springdoc-openapi 的理由 1、springdoc-openapi 是 spring 官方出品&#xff0c;与 springboot 兼容更好&#xff08;springfox 兼容有坑&#xff09; 2、springdoc-openapi 社区更活跃&#xff0c;springfox 已经 2 年没更新了 3、springdoc-openapi 的注解更接近 …

力导向图与矩阵排序

Graph-layout force directed&#xff08;力导向图布局&#xff09;是一种用于可视化网络图的布局算法。它基于物理模型&#xff0c;模拟了图中节点之间的相互排斥和连接弹性&#xff0c;以生成具有良好可读性和美观性的图形布局。 在力导向图布局中&#xff0c;每个节点被视为…

(一)Matlab数值计算基础

目录 1.1Matlab命令组成 1.1.1基本符号 1.1.2功能符号 1.1.3常用命令 1.1Matlab命令组成 1.1.1基本符号 #提示运算符&#xff0c;表示软件处于准备就绪状态。在提示符号后输入一条命令或者一段程序后按Enter键&#xff0c;软件将给出相应的结果 >> *…

基于SpringBoot的影院订票系统

文章目录 项目介绍主要功能截图:部分代码展示设计总结项目获取方式🍅 作者主页:超级无敌暴龙战士塔塔开 🍅 简介:Java领域优质创作者🏆、 简历模板、学习资料、面试题库【关注我,都给你】 🍅文末获取源码联系🍅 项目介绍 基于SpringBoot的影院订票系统,java项目…

牛客练习赛50-C

题目描述 在一个游戏中&#xff0c;tokitsukaze需要在n个士兵中选出一些士兵组成一个团去打副本。 第i个士兵的战力为v[i]&#xff0c;团的战力是团内所有士兵的战力之和。 但是这些士兵有特殊的要求&#xff1a;如果选了第i个士兵&#xff0c;这个士兵希望团的人数不超过s[i]…

【Proteus仿真】【Arduino单片机】汽车尾气检测报警系统

文章目录 一、功能简介二、软件设计三、实验现象联系作者 一、功能简介 本项目使用Proteus8仿真Arduino单片机控制器&#xff0c;使用按键、LCD1602液晶、蜂鸣器模块、CO、NOx、HC和PM2.5气体传感器等。 主要功能&#xff1a; 系统运行后&#xff0c;LCD1602显示CO、NOx、HC和…

手机录屏没有声音?让你的录屏有声有色

“有人知道手机录屏怎么录声音吗&#xff1f;今天录制了一个小时的直播视频&#xff0c;后面查看的时候发现没有声音&#xff0c;真的非常崩溃&#xff0c;想问问大家有没有办法&#xff0c;解决这个问题。” 在手机录屏的过程中&#xff0c;有时候我们可能会面临录制视频没有…

使用 Spectrum LSF 设置多集群和作业转发

使用 Spectrum LSF 设置多集群和作业转发 以下示例是有关如何使用 Spectrum LSF设置多集群和作业转发的指南。 此示例说明了集群是本地集群&#xff0c;另一个在云中的常见情况。 此示例假定标注为 “OnPremiseCluster” 的内部部署集群使用子网 192.168.0.0/24 &#xff0c;…

Spring技术内幕笔记之IOC的实现

IOC容器的实现 依赖反转&#xff1a; 依赖对象的获得被反转了&#xff0c;于是依赖反转更名为&#xff1a;依赖注入。许多应用都是由两个或者多个类通过彼此的合作来实现业务逻辑的&#xff0c;这使得每个对象都需要与其合作的对象的引用&#xff0c;如果这个获取过程需要自身…

奇因子之和(C语言)

题意&#xff1a; 一个整数的因子&#xff0c;就是所有可以整除这个数的数。奇数指在整数中&#xff0c;不能被 2 整除的数。所谓整数 Z 的奇因子&#xff0c;就是可以整除 Z 的奇数。 给定 N 个正整数&#xff0c;请你求出它们的第二大奇因子的和。当然&#xff0c;如果该数只…

Amazon API Gateway CORS 实战

Amazon API Gateway提供了一种实现跨域资源共享&#xff08;CORS&#xff09;的方式&#xff0c;以便在Web应用程序中安全地使用API。下面是Amazon API Gateway CORS的实战指南&#xff1a; 创建一个API Gateway REST API并定义资源和方法。在资源上启用CORS&#xff0c;可以通…

程序的重定位

可以理解为编译和链接 过程中产生的地址项都是临时的相对的。编译的时候的地址&#xff0c;在链接时会被修改。最终链接后生成的bin文件的地址项&#xff0c;在加载运行时 也会被修改。 链接器会对所有的输入文件进行扫描&#xff0c;之后就可以确定段的大小&#xff0c;符号定…

从0开始搭建清华ChatGLM3 6b大模型(Windows RTX4090版)

目录 1、硬件及软件说明 2、安装Anaconda 3、安装Git版本控制 ​4、安装pytorch驱动 5、安装ChatGLM3 1、硬件及软件说明 硬件&#xff1a;主要是GPU卡内存要足够&#xff0c;本次搭建使用的RTX4090卡一张&#xff0c;单卡内存24G&#xff0c;为什么选择4090&#xff1f;…

如何在ArcGIS Pro中指定坐标系

在进行制图的时候&#xff0c;为了实现某些特定的效果&#xff0c;需要指定特定的坐标系&#xff0c;但是现有的数据可能不是所需要的坐标系&#xff0c;这时候就需要对现有的数据坐标系进行处理&#xff0c;这里为大家介绍一下ArcGIS Pro中指定坐标系的方法&#xff0c;希望能…

ECMAScript和JavaScript:深入理解它们的关系与区别

ECMAScript和JavaScript&#xff1a;深入理解它们的关系与区别 在讨论ECMAScript和JavaScript之间的关系及其区别时&#xff0c;我们首先需要澄清一些常见的误解。很多人会将这两个术语混为一谈&#xff0c;但实际上&#xff0c;它们指代的是不同的概念。今天&#xff0c;我们…

STM32存储左右互搏 SPI总线读写FRAM MB85RS2M

STM32存储左右互搏 SPI总线读写FRAM MB85RS2M 在中低容量存储领域&#xff0c;除了FLASH的使用&#xff0c;&#xff0c;还有铁电存储器FRAM的使用&#xff0c;相对于FLASH&#xff0c;FRAM写操作时不需要预擦除&#xff0c;所以执行写操作时可以达到更高的速度&#xff0c;其…