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;
        }
    }

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

西门子宣布SIMATIC S-300停产?找找理想替代品——钡铼BL30x系列工控机

1994年&#xff0c;西门子发布了S7系列的第一批产品&#xff0c;其中包括S7-300。SIMATIC S7的推出也见证了新的现场总线标准Profibus的发布&#xff0c;以及率先使用工业总线来促进自动化设备之间的通信。S7-300 CPU系列的巨大成功也帮助西门子进一步巩固了其全球自动化技术领…

格局初现:京东阿里都瞄准了这个万亿级的大市场

核 心 要 点 ▪ 企业采购有哪些痛点和解决方案&#xff1f;行业的关键赛点是什么&#xff1f; ▪ 现行格局是何情况&#xff1f;代表性玩家各自有何特点&#xff1f; ▪ 未来企业采购将往何处去&#xff1f; 当这样一组数据摆在眼前的时候&#xff0c;你或许会感到难以置…

Gitee

Gitee码云 0. 笔记说明1. Gitee概述2. Gitee和GitHub3. 创建Git远程仓库4. 分享已有项目到Gitee5. 文件恢复和合并6. 文件push或pull冲突7. 添加项目成员 0. 笔记说明 该笔记以IDEA 2023专业版进行操作需提前注册好个人gitee账号安装好IDEA的相关gitee插件或者安装Git Bash软件…

C语言:二分查找查找有序数组中的元素

前言 在我们学习C语言的过程中&#xff0c;如果要查找一个数组当中是否存在某一个元素&#xff0c;我们可能会遍历整个数组&#xff0c;来依次判断是否存在这个函数&#xff0c;但这么做是效率极低的&#xff0c;如果数组中有很多个元素&#xff0c;那么我们要查找半天 二分查…

【CASS精品教程】CASS11计算城镇建筑密度

CASS中可以很方便计算建筑密度。 文章目录 一、建筑密度介绍二、CASS计算建筑密度1. 绘制宗地范围2. 绘制建筑物3. 计算建筑密度三、注意事项一、建筑密度介绍 建筑密度(building density;building coverage ratio),指在一定范围内,建筑物的基底面积总和与占用地面积的比…

CTFshow web入门web128-php特性31

开启环境: 一个新的姿势&#xff0c;当php扩展目录下有php_gettext.dll时&#xff1a; _()是一个函数。 _()gettext() 是gettext()的拓展函数&#xff0c;开启text扩展get_defined_vars — 返回由所有已定义变量所组成的数组。 call_user_func — 把第一个参数作为回调函数调…

JAVAEE初阶相关内容第二十弹--HTTP协议

写在前&#xff1a;2024年啦&#xff01;新的一年要努力学习啦 本篇博客围绕HTTP协议&#xff0c;对HTTP协议进行了解&#xff0c;需要理解其工作过程&#xff0c;对HTTP协议格式要清楚&#xff0c;通过抓包工具进行协议分析&#xff0c;认识“方法”、“请求报头”&#xff0c…

阿里云迁移AWS视频点播技术攻坚

文章目录 &#x1f437; 背景&#x1f9a5; 简述&#x1f425; Aws服务&#x1f99c; AWS CloudFormation&#x1f41e; 问题&#x1f409; 落地方案&#x1f989; Aws vs Aliyun&#x1f344; 避坑指南 &#x1f437; 背景 由于AWS整体成本略低于阿里云&#xff0c;公司决定将…

一个项目的上线全过程

营业执照 个体户&#xff08;700执照、2年财务代理 4000&#xff09; 一张一类卡&#xff0c;转卡专用&#xff08;个人卡&#xff09; 120w 45%企业资质&#xff08;个体户&#xff09; 企业微信&#xff08;300元/年、公众号、小程序&#xff09; 相关手续 备案域名去申请支付…

使用UDF扩展Spark SQL

Apache Spark是一个强大的分布式计算框架&#xff0c;Spark SQL是其一个核心模块&#xff0c;用于处理结构化数据。虽然Spark SQL内置了许多强大的函数和操作&#xff0c;但有时可能需要自定义函数来处理特定的数据需求。在Spark SQL中&#xff0c;可以使用UDF&#xff08;User…

C++初阶——类与对象

目录 C宏函数 在使用宏函数时&#xff0c;有几个常见的错误需要注意&#xff1a; 宏函数在某些情况下有以下优势&#xff1a; 1.C宏函数 在 C 中&#xff0c;宏函数&#xff08;Macro Function&#xff09;是使用预处理器定义的宏&#xff08;Macro&#xff09;&#xff0…

Android studio ViewPager2应用设计

一、ViewPager2应用场景&#xff1a; ViewPager2是一个功能强大的滑动容器&#xff0c;提供灵活的页面切换和布局定制功能&#xff0c;使得应用程序界面更加丰富和交互性强&#xff0c;主要应用于以下场景&#xff1a; 1&#xff09;、实现引导页或欢迎页&#xff1a;ViewPag…

Microsoft Visual Studio 2022 install Project 下载慢

1. 关闭Internet 协议版本6 2. 如果没有效果&#xff0c;打开Internet 协议版本4&#xff0c;更改DNS 3. 在浏览器中下载后安装&#xff0c;下载地址如下&#xff1a; Microsoft Visual Studio Installer Projects 2022 - Visual Studio Marketplace 4. 安装时注意关闭vs&…

Maven 整理(含面试题)

Maven是Java 项目必备&#xff0c;Maven 主要服务于基于Java平台的项目构建、依赖管理和项目信息管理。项目构建工具 、更好的管理依赖 目录 Maven安装与运行maven 重要知识点面试题 Maven安装与运行 Maven 是一个项目管理工具&#xff0c;可以对 Java 项目进行构建、依赖管理…

ThreadLocal线程重用导致用户信息错乱的 Bug

在生产上遇到一个诡异的问题&#xff0c;有时获取到的用户信息是别人的。查看代码后&#xff0c;我发现他使用了 ThreadLocal 来缓存获取到的用户信息。 我们知道&#xff0c;ThreadLocal 适用于变量在线程间隔离&#xff0c;而在方法或类间共享的场景。如果用户信息的获取比较…

[足式机器人]Part2 Dr. CAN学习笔记-自动控制原理Ch1-8Lag Compensator滞后补偿器

本文仅供学习使用 本文参考&#xff1a; B站&#xff1a;DR_CAN Dr. CAN学习笔记-自动控制原理Ch1-8Lag Compensator滞后补偿器 从稳态误差入手&#xff08;steady state Error&#xff09; 误差 Error &#xff1a; E ( s ) R ( s ) − X ( s ) R ( s ) − E ( s ) ⋅ K G …

CMake入门教程【基础篇】CMake+Visual Studio2022构建C++项目

文章目录 1.概述2.Visual Studio 2022简介3.安装Visual Studio 20224.安装CMake5.创建CMake项目6. 构建项目 1.概述 CMake和Visual Studio 2022结合 在现代软件开发中&#xff0c;CMake和Visual Studio 2022的结合提供了一个强大的环境&#xff0c;用于构建和管理各种规模的C项…

1213:八皇后问题 深度优先搜索算法

1213&#xff1a;八皇后问题 时间限制: 1000 ms 内存限制: 65536 KB 【题目描述】 在国际象棋棋盘上放置八个皇后&#xff0c;要求每两个皇后之间不能直接吃掉对方。 【输入】 (无) 【输出】 按给定顺序和格式输出所有八皇后问题的解&#xff08;见样例&#xff09;。 题目…

【Matlab】PSO-BP 基于粒子群算法优化BP神经网络的数据时序预测(附代码)

资源下载&#xff1a; https://download.csdn.net/download/vvoennvv/88689096 一&#xff0c;概述 PSO-BP算法是一种结合了粒子群算法&#xff08;PSO&#xff09;和BP神经网络的方法&#xff0c;用于数据时序预测。下面是PSO-BP算法的原理和过程&#xff1a; 1. 数据准备&…

如何移除视频中的背景音乐或人物声音

移除视频声音是将视频指定的声音移除&#xff0c;可以选择移除人物声音还是视频的背景音乐&#xff0c;方便实现二次创作。 小编给大家推荐一些方法帮助大家更轻松地移除视频中的背景音乐或人物声音&#xff0c;有兴趣的朋友请自行百度查找&#xff0c;或小程序查找 1、方法&a…