[算法] ArrayList 和 LinkedList 的优缺点比较及使用场景

news2025/2/24 3:32:45

😚一个不甘平凡的普通人,致力于为Golang社区和算法学习做出贡献,期待您的关注和认可,陪您一起学习打卡!!!😘😘😘
🤗专栏:算法学习
🤗专栏:Go实战
💬个人主页:个人主页

在这里插入图片描述

文章目录

  • ArrayList 和 LinkedList 介绍
    • 数据结构
    • 操作性能

ArrayList 和 LinkedList 介绍

ArrayList和LinkedList都是Java中的List接口的实现类,它们的区别在于底层数据结构以及对各种操作的性能表现不同。

数据结构

ArrayList的底层数据结构是动态数组,内部维护一个Object[]数组来存储元素。当添加元素时,如果当前数组已满,就会创建一个新的数组,并将原有数组的元素复制到新数组中,再将新元素添加到新数组中。这样做的好处在于在访问指定元素时速度较快,但添加或删除元素时因为需要频繁复制数组,效率比较低。

LinkedList的底层数据结构是双向链表,每个节点包含了前驱节点和后继节点的引用。这样做的好处在于添加或删除元素时只需要改变相邻节点的引用即可,效率比较高。但在访问指定元素时需要遍历整个链表才能找到目标元素,速度较慢。

操作性能

ArrayList在访问指定位置的元素时效率比较高,因为可以通过下标直接访问数组中的元素。但在添加或删除元素时,由于需要给数组腾出空间并复制元素,效率较低。具体来说,对于一个大小为n的ArrayList:

访问指定元素:O(1)
添加元素:平均复杂度O(n),最差情况下O(n)
删除元素:平均复杂度O(n),最差情况下O(n)

LinkedList在访问指定位置的元素时效率比较低,因为需要遍历链表才能找到目标元素。但在添加或删除元素时,只需要修改相邻节点的引用,效率较高。具体来说,对于一个大小为n的LinkedList:

访问指定元素:平均复杂度O(n),最差情况下O(n)
添加元素:平均复杂度O(1),最好情况下O(1),最坏情况下O(n)
删除元素:平均复杂度O(1),最好情况下O(1),最坏情况下O(n)
案例
假设有一个需求,需要将一个固定长度的队列按顺序依次输出所有元素。可以考虑使用ArrayList或LinkedList来实现。

首先是ArrayList的实现方式:

import java.util.ArrayList;
import java.util.List;
public class ArrayListDemo {

    public static void main(String[] args) {
        int n = 10;
        List<Integer> list = new ArrayList<>(n);
        for (int i = 0; i < n; i++) {
            list.add(i);
        }
        for (int i = 0; i < n; i++) {
            System.out.print(list.get(i) + " ");
        }
    }

上面的代码中,首先创建了一个大小为n的ArrayList,并依次添加元素。然后使用for循环遍历列表并输出所有元素。由于ArrayList支持O(1)时间复杂度的访问操作,因此可以直接通过下标访问列表中的元素。

接下来是LinkedList的实现方式:

import java.util.LinkedList;

public class LinkedListDemo {

    public static void main(String[] args) {
        int n = 10;
        LinkedList<Integer> list = new LinkedList<>();
        for (int i = 0; i < n; i++) {
            list.add(i);
        }
        for (Integer num : list) {
            System.out.print(num + " ");
        }
    }

请添加图片描述

我是不想摆烂的 万物皆可der码字不易,感谢您的阅读,希望对您有所帮助。关注我,完成每日算法自律打卡,学习什么时候开始都不晚!!

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

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

相关文章

MySQL高级_第12章_数据库其它调优策略

MySQL高级_第12章_数据库其它调优策略 1. 数据库调优的措施 1.1 调优的目标 尽可能 节省系统资源 &#xff0c;以便系统可以提供更大负荷的服务。&#xff08;吞吐量更大&#xff09; 合理的结构设计和参数调整&#xff0c;以提高用户操作 响应的速度 。&#xff08;响应速…

使用Visual Studio进行cuda编程配置环境四大坑(附解决方案)

写在前面&#xff0c;用于没有使用过Visual Studio进行cuda编程的同学看&#xff0c;以免在安装环境的时候踩到坑 第一坑&#xff1a;CUDA版本与NVIDIA显卡版本不匹配问题: 安装cuda版本坑&#xff0c;强烈建议看下自己的显卡支持什么版本的cuda&#xff0c;切记不要用最新版…

由浅入深Netty基础知识NIO网络编程

目录 1 非阻塞 vs 阻塞1.1 阻塞1.2 非阻塞1.3 多路复用 2 Selector2.1 创建2.2 绑定 Channel 事件2.3 监听 Channel 事件2.4 select 何时不阻塞 3 处理 accept 事件3.1 事件发生后能否不处理 4 处理 read 事件4.1 为何要 iter.remove()4.2 cancel 的作用4.3 不处理边界的问题4.…

Python 迭代器与生成器

一. 迭代器 迭代是Python最强大的功能之一&#xff0c;是访问集合元素的一种方式。 &#xff08;1&#xff09;迭代器对象从集合的第一个元素开始访问&#xff0c;直到所有的元素被访问完结束。 &#xff08;2&#xff09;迭代器可以记住遍历的位置的对象&#xff0c;并且只能…

Springboot 整合 spring security,简单实现认证和授权

一.简介 Spring Security 是 Spring 家族中的一个安全管理框架。 一般来说&#xff0c;常见的安全管理技术栈的组合是这样的&#xff1a; SSM ShiroSpring Boot/Spring Cloud Spring Security 对于一个权限管理框架而言&#xff0c;无论是 Shiro 还是 Spring Security&am…

tf.image.decode_jpeg(别名tf.io.decode_jpeg)函数工作原理分析

1 问题提出 最近在阅读某个论文的源代码时&#xff0c; 发现作者在读取图像数据时没有使用PIL.Image或opencv库&#xff0c;而是使用了tf.image.decode_jpeg&#xff0c;代码节选如下&#xff1a; # tf1中的函数, 用于读取文件 # tf2中该函数更改为了tf.io.read_file image_c…

【Linux权限的概念及理解】

目录 一、认识linux下的用户分类二、什么叫权限三、没有权限会怎么样&#xff08;见一见&#xff09;四、权限的修改问题4.1chmod指令4.2chown指令4.3chgrp指令 五、两个问题粘滞位5.1Question15.2Question25.3粘滞位 一、认识linux下的用户分类 Linux下有两种用户&#xff1a…

mysql中的Redo log

目录标题 前言redolog保证持久性redolog工作过程 redo log中的WAL&#xff08;先写日志&#xff0c;再写磁盘【写入redo log file】&#xff09;刷盘策略 重要参数innodb_flush_log_at_trx_commit如何选择 Redo log file日志文件日志文件组redo log刷盘与数据页刷盘redo log何时…

Vue CLI Todo-List案例

3.7. Todo-List 案例 组件化编码流程 拆分静态组件&#xff1a;组件要按照功能点拆分&#xff0c;命名不要与html元素冲突实现动态组件&#xff1a;考虑好数据的存放位置&#xff0c;数据是一个组件在用&#xff0c;还是一些组件在用 一个组件在用&#xff1a;放在组件自身即…

Cesium入门之八:Cesium加载矢量数据

目录 一、什么是矢量数据二、Cesium支持的矢量数据格式KML格式KmlDataSource CZML格式CzmlDataSource GeoJSON格式GeoJsonDataSource 三、Cesium加载GeoJSON数据格式的中国地图示例 一、什么是矢量数据 矢量数据是用于描述地理空间几何特征的一类基于向量的地理信息数据&#…

RabbitMQ的几种通讯方式及其代码示例

文章目录 一、引言二、RabbitMQ介绍三、RabbitMQ安装四、RabbitMQ架构4.1 官方的简单架构图4.2 RabbitMQ的完整架构图4.3 RabbitMQ 通讯方式4.4 Hello-World案例演示4.5 基本原理 五、SpringBoot整合RabbitMQ的使用5.1 导入依赖5.2 在application.properties中增加配置5.3 Hell…

前端学习--Vue(2)

一、Vue简介 1.1 概念 Vue是一套用于构建用户界面的前端框架 框架&#xff1a;现成解决方案&#xff0c;遵守规范去编写业务功能 指令、组件、路由、Vuex、vue组件库 1.2 特性 数据驱动视图 vue连接页面结构和数据&#xff0c;监听数据变化&#xff0c;自动渲染页面结构…

Vue--》Vue 3 路由进阶——从基础到高级的完整指南

目录 Vue3中路由讲解与使用 路由的安装与使用 路由模式的使用 编程式路由导航 路由传参 嵌套路由 命名视图 重定向与别名 Vue3中路由讲解与使用 Vue 路由是 Vue.js 框架提供的一种机制&#xff0c;它用于管理网页上内容的导航。Vue 路由可以让我们在不刷新页面的情况下…

【ChatGPT】通过 ChatGPT 用文字描述来绘制插画

点击上方“独立开发者杂谈” 喜欢本文&#xff0c;请置顶或星标 使用文字描述绘制插画具有以下好处 无需绘画技巧&#xff0c;体验与AI结合&#xff0c;创意灵活性&#xff0c;节省时间。 使用 Figma 工具 Figma &#xff08;https://www.figma.com&#xff09;是一款流行的设计…

Linux:iptables防火墙

Linux&#xff1a;iptables防火墙 一、iptables防火墙概述1.1 iptables防火墙1.2 netfilter/iptables 关系 二、Linux防火墙基础2.1 iptables的表、链结构2.2 数据包控制的匹配流程 三、编写防火墙规则3.1 基本语法、控制类型3.2 添加、查看、删除规则等3.3 规则的匹配条件3.3.…

黑马Redis原理篇

黑马Redis原理篇 1、数据结构1.1、动态字符串SDS1.2、IntSet1.3、Dict1.4、ZipList1.5、QuickList1.6、SkipList1.7、RedisObject1.8、五种数据结构1. String&#xff08;小EMBSTR,大RAW (SDS),少量整数INT&#xff09;2. List&#xff08;Redis3.2之后使用QuickList实现&#…

CSDN周赛52期及53期浅析

好久没写题解了&#xff0c;没办法&#xff0c;C站的题目更新的速度太慢了&#xff0c;重复考过去的老题已经不能再进步了。52期还混了个名次&#xff0c;总要写篇文章完成一下任务。而53期就惨了去了&#xff0c;三道选择题全蒙错了。 反正我个人觉得在现在C站的OJ环境里考选…

手撸鉴权系统——SpringBoot2+Vue2(一定惊喜满满,万字长文)

初衷&#xff1a; 一直不太理解整个前后端的鉴权&#xff0c;跨域等问题&#xff0c;抽空两个晚上整理出万字文章&#xff0c;也是对于自己的一个交代&#xff0c;现在共享出来&#xff0c;希望大家也能受益&#xff0c;将使用过程在这里一一详述&#xff0c;还是多说一句&…

【图论(1)】图的存储、遍历与拓扑排序

5月16-5月18日学习内容 文章目录 一、图是什么二、图的存储1、直接存边法2、邻接矩阵法3、邻接表法4、链式前向星时间复杂度分析 三、图的遍历DFSBFS 四、拓扑排序&#xff08;今天实在没时间写了&#xff0c;明天写&#xff09; 一、图是什么 这是oi.wiki给的定义 简而言之…

ENVI制图——土地利用专题图

ENVI制图 0 前言1 数据准备2 数据预处理2.1 先在arcmap中把数据导出为tif格式&#xff0c;然后加入envi&#xff08;别问我为什么要先用arcmap处理&#xff0c;因为这是envi制图教程 :( &#xff09;2.2 直接把tif格式的数据拖进envi&#xff0c;此时看不到数据类别&#xff0c…