【某大厂一面】数组和链表区别

在 Java 中,数组Array)和链表LinkedList)是两种常见的数据结构,它们在存储和操作方式上有显著的区别。了解它们的差异有助于选择适合特定应用场景的结构。下面是数组和链表之间的详细比较。

1. 存储结构

数组(Array)
  • 连续内存空间:数组在内存中是一个连续的块,所有元素依次存储在一起。
  • 固定大小:数组的大小在创建时就确定,不能动态调整。创建后不能改变大小(除非重新创建数组并拷贝内容)。
  • 索引访问:数组支持通过索引直接访问任意位置的元素,时间复杂度为 O(1)。
链表(LinkedList)
  • 非连续内存:链表中的元素(节点)并不保存在连续的内存位置。每个节点包含一个数据部分和一个指向下一个节点的引用(对于双向链表,还有指向前一个节点的引用)。
  • 动态大小:链表的大小可以动态变化,不需要预先指定大小。可以在运行时不断添加或删除节点。
  • 逐步访问:访问链表中的元素需要从头节点开始,逐一遍历节点,直到找到目标元素。时间复杂度是 O(n),其中 n 是链表的长度。

2. 内存使用

数组
  • 内存分配:数组一次性分配连续的内存空间,内存效率较高。但如果数组大小太大,可能会浪费空间;如果大小过小,则可能需要重新分配新的更大数组。
  • 固定大小:一旦数组的大小固定后,就无法扩展。如果数组大小不够,需要创建一个新的数组并将数据复制到新数组中。
链表
  • 内存分配:链表的每个节点都是单独分配内存的,因此内存使用更加灵活。每次新增元素时,只需要分配一个节点的内存。
  • 节点开销:每个节点除了存储数据外,还需要存储指向其他节点的引用,因此链表的内存开销比数组大,尤其是双向链表需要存储两个引用(前向引用和后向引用)。

3. 时间复杂度

数组
  • 访问元素:由于数组支持通过索引直接访问元素,访问时间是常数时间,O(1)。
  • 插入和删除
    • 在数组的 末尾 插入或删除元素时间复杂度是 O(1)。
    • 在数组的 中间 插入或删除元素时,需要移动后续的元素,时间复杂度是 O(n)。
链表
  • 访问元素:需要从头节点开始遍历,逐个节点查找目标元素,时间复杂度是 O(n)。
  • 插入和删除
    • 在链表的 头部 插入或删除元素时间复杂度是 O(1)。
    • 在链表的 中间末尾 插入或删除元素也可以在 O(1) 时间完成,但需要先找到目标位置,找到位置的时间复杂度是 O(n)。

4. 使用场景

数组
  • 优点

    • 直接的索引访问非常高效,适用于查找操作频繁的场景。
    • 存储连续的元素,内存管理较简单。
    • 适合元素个数已知且不经常变动的场景。
  • 缺点

    • 大小固定,扩展困难(需要重新分配更大的数组)。
    • 插入和删除操作较慢,特别是中间的插入和删除,需要大量元素移动。
    • 随着元素增多,可能会浪费内存。
链表
  • 优点

    • 动态大小,能方便地进行插入和删除操作,尤其是在头部或尾部插入删除。
    • 不需要预先分配固定大小,内存使用更加灵活。
  • 缺点

    • 访问速度较慢,需要逐一遍历节点,不能像数组那样通过索引直接访问。
    • 每个节点需要额外存储指向下一个节点的引用,增加了内存开销。

5. 代码示例

数组示例
public class ArrayExample {public static void main(String[] args) {// 创建一个大小为 5 的数组int[] arr = new int[5];// 向数组中添加元素arr[0] = 10;arr[1] = 20;arr[2] = 30;arr[3] = 40;arr[4] = 50;// 通过索引访问元素System.out.println("Element at index 2: " + arr[2]);// 插入元素时需要重新分配数组(手动管理)}
}
链表示例(使用 LinkedList 类)
import java.util.LinkedList;public class LinkedListExample {public static void main(String[] args) {// 创建一个 LinkedListLinkedList<Integer> linkedList = new LinkedList<>();// 向链表中添加元素linkedList.add(10);linkedList.add(20);linkedList.add(30);// 访问链表中的元素System.out.println("First element: " + linkedList.get(0));// 插入元素linkedList.addFirst(5); // 在链表的头部插入元素linkedList.addLast(40); // 在链表的尾部插入元素System.out.println("Linked list: " + linkedList);// 删除元素linkedList.removeFirst(); // 删除头部元素linkedList.removeLast();  // 删除尾部元素System.out.println("After deletion: " + linkedList);}
}

6. ArrayList 和 LinkedList 的比较(Java 视角)

在 Java 中,ArrayListLinkedList 都实现了 List 接口,但它们在底层实现上有所不同。ArrayList 使用数组作为存储结构,而 LinkedList 使用双向链表。

  • ArrayList

    • 支持通过索引快速访问元素。
    • 插入和删除元素的时间复杂度通常为 O(n),特别是在中间位置。
  • LinkedList

    • 支持快速的插入和删除,特别是在头部或尾部。
    • 访问元素时需要遍历链表,访问时间较慢。

7. 总结

特性数组(Array)链表(LinkedList)
存储结构连续的内存空间每个节点包含数据和指向下一个节点的引用
大小固定大小动态大小
访问效率快速 O(1)需要遍历,O(n)
插入/删除效率中间插入/删除 O(n),尾部 O(1)插入/删除 O(1)(头尾),查找 O(n)
内存管理静态分配,可能浪费空间节点动态分配,内存使用灵活
使用场景查找操作频繁,大小已知且不变的场景插入/删除频繁,元素动态变化的场景

选择使用数组还是链表,取决于具体应用场景。如果需要频繁的随机访问,数组是更好的选择。如果需要频繁的插入和删除操作,链表会更高效。

小伙伴们在开发过程中有使用心得可以再评论区一块讨论

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

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

相关文章

网络工程师 (5)系统可靠性

前言 系统可靠性是指系统在规定的条件和规定的时间内&#xff0c;完成规定功能的能力。这种能力不仅涵盖了系统本身的稳定性和耐久性&#xff0c;还涉及了系统在面对各种内外部干扰和故障时的恢复能力和容错性。系统可靠性是评价一个系统性能优劣的关键指标之一&#xff0c;对于…

【2024年华为OD机试】(C卷,200分)- 推荐多样性 (JavaScriptJava PythonC/C++)

一、问题描述 问题描述 我们需要从多个已排序的列表中选取元素&#xff0c;以填充多个窗口。每个窗口需要展示一定数量的元素&#xff0c;且元素的选择需要遵循特定的穿插策略。具体来说&#xff0c;我们需要&#xff1a; 从第一个列表中为每个窗口选择一个元素&#xff0c;…

损失函数 Loss Function

分类问题和回归问题常使用的损失函数如下&#xff1a; 分类问题 交叉熵损失函数&#xff08;Cross-Entropy Loss&#xff09;&#xff1a;用于衡量两个概率分布之间的差异&#xff0c;在多分类问题中广泛应用。 ce_loss nn.CrossEntropyLoss() 回归问题 均方误差损失函数&…

Chameleon(变色龙) 跨平台编译C文件,并一次性生成多个平台的可执行文件

地址:https://github.com/MartinxMax/Chameleon Chameleon 跨平台编译C文件&#xff0c;并一次性生成多个平台的可执行文件。可以通过编译Chameleon自带的.C文件反向Shell生成不同平台攻击载荷。 登录 & 代理设置 按照以下步骤设置 Docker 的代理&#xff1a; 创建配置目…

DFFormer实战:使用DFFormer实现图像分类任务(二)

文章目录 训练部分导入项目使用的库设置随机因子设置全局参数图像预处理与增强读取数据设置Loss设置模型设置优化器和学习率调整策略设置混合精度&#xff0c;DP多卡&#xff0c;EMA定义训练和验证函数训练函数验证函数调用训练和验证方法 运行以及结果查看测试完整的代码 在上…

几种K8s运维管理平台对比说明

目录 深入体验**结论**对比分析表格**1. 功能对比****2. 用户界面****3. 多租户支持****4. DevOps支持** 细对比分析1. **Kuboard**2. **xkube**3. **KubeSphere**4. **Dashboard****对比总结** 深入体验 KuboardxkubeKubeSphereDashboard 结论 如果您需要一个功能全面且适合…

DeepSeek API 的获取与对话示例

代码文件下载&#xff1a;Code 在线链接&#xff1a;Kaggle | Colab 文章目录 注册并获取API环境依赖设置 API单轮对话多轮对话流式输出更换模型 注册并获取API 访问 https://platform.deepseek.com/sign_in 进行注册并登录&#xff1a; 新用户注册后将赠送 10 块钱余额&#…

基于STM32的循迹小车设计与实现

1 系统方案设计 根据系统设计功能&#xff0c;展开基于STM32的循迹小车设计&#xff0c;整体设计框图如图2.1所示。系统采用STM32单片机作为控制器,通过L298驱动器控制两个直流电机实现对小车的运动控制&#xff0c;两路红外模块实现黑线的检测&#xff0c;HC-SR04超声波模块实…

Docker/K8S

文章目录 项目地址一、Docker1.1 创建一个Node服务image1.2 volume1.3 网络1.4 docker compose 二、K8S2.1 集群组成2.2 Pod1. 如何使用Pod(1) 运行一个pod(2) 运行多个pod 项目地址 教程作者&#xff1a;教程地址&#xff1a; https://www.bilibili.com/video/BV1Zn4y1X7AZ?…

算法每日双题精讲 —— 二分查找(寻找旋转排序数组中的最小值,点名)

&#x1f31f;快来参与讨论&#x1f4ac;&#xff0c;点赞&#x1f44d;、收藏⭐、分享&#x1f4e4;&#xff0c;共创活力社区。 &#x1f31f; 别再犹豫了&#xff01;快来订阅我们的算法每日双题精讲专栏&#xff0c;一起踏上算法学习的精彩之旅吧&#x1f4aa; 在算法的…

【踩坑日常,已解决】彻底修改IDEA项目的JDK版本,8改为17

三处修改彻底解决IDEA中JDK版本不对问题&#xff08;8改为17&#xff09; 文章目录 三处修改彻底解决IDEA中JDK版本不对问题&#xff08;8改为17&#xff09;第一处第二处第三处 第一处 setting -> Build, Execution, Deployment -> Java Compiler -> Target bytecod…

redis的分片集群模式

redis的分片集群模式 1 主从哨兵集群的问题和分片集群特点 主从哨兵集群可应对高并发写和高可用性&#xff0c;但是还有2个问题没有解决&#xff1a; &#xff08;1&#xff09;海量数据存储 &#xff08;2&#xff09;高并发写的问题 使用分片集群可解决&#xff0c;分片集群…

Nuxt:利用public-ip这个npm包来获取公网IP

目录 一、安装public-ip包1.在Vue组件中使用2.在Nuxt.js插件中使用public-ip 一、安装public-ip包 npm install public-ip1.在Vue组件中使用 你可以在Nuxt.js的任意组件或者插件中使用public-ip来获取公网IP。下面是在一个Vue组件中如何使用它的例子&#xff1a; <template…

搭建Spring Boot开发环境

JDK&#xff08;1.8及以上版本&#xff09; Apache Maven 3.6.0 修改settings.xml 设置本地仓库位置 <localRepository>D:/repository</localRepository> 设置远程仓库镜像 <mirror><id>alimaven</id><name>aliyun maven</name&…

智慧校园在职业学校的实施与展望

随着信息技术的发展&#xff0c;智慧校园的概念逐渐走进人们的视野。智慧校园不仅是一个技术层面的概念&#xff0c;更是教育理念的一次革新。对于职业教育而言&#xff0c;智慧校园的应用更是具有重要意义。通过引入物联网、大数据等先进技术&#xff0c;可以实现教学资源的高…

Excel中LOOKUP函数的使用

文章目录 VLOOKUP&#xff08;垂直查找&#xff09;&#xff1a;HLOOKUP&#xff08;水平查找&#xff09;&#xff1a;LOOKUP&#xff08;基础查找&#xff09;&#xff1a;XLOOKUP&#xff08;高级查找&#xff0c;较新版本Excel提供&#xff09;&#xff1a; 在Excel中&…

React第二十六章(createPortal)

createPortal 注意这是一个API&#xff0c;不是组件&#xff0c;他的作用是&#xff1a;将一个组件渲染到DOM的任意位置&#xff0c;跟Vue的Teleport组件类似。 用法 import { createPortal } from react-dom;const App () > {return createPortal(<div>小满zs<…

k8s 蓝绿发布、滚动发布、灰度发布

在Kubernetes&#xff08;k8s&#xff09;中&#xff0c;蓝绿发布、滚动发布、灰度发布&#xff08;金丝雀发布&#xff09;是三种常见的应用部署和更新策略。下面将分别对这几种发布方式进行说明&#xff0c;并给出相应的例子。 蓝绿发布 蓝绿发布是一种无缝切换版本的部署策…

【R语言】数学运算

一、基础运算 R语言中能实现加、减、乘、除、求模、取整、取绝对值、指数、对数等运算。 x <- 2 y <- 10 # 求模 y %% x # 整除 y %/% x # 取绝对值 abs(-x) # 指数运算 y ^x y^1/x #对数运算 log(x) #log()函数默认情况下以 e 为底 双等号“”的作用等同于identical(…

DeepSeek学术写作测评第一弹:论文润色,中译英效果如何?

我是娜姐 迪娜学姐 &#xff0c;一个SCI医学期刊编辑&#xff0c;探索用AI工具提效论文写作和发表。 最近风很大的DeepSeek&#xff0c;持续火出圈&#xff0c;引起了硅谷AI圈的热议。很多学员让娜姐测评一下对于平时需要学术写作润色的论文党&#xff0c;效果究竟怎么样&…