java ArrayList与LinkedList比较

news/2024/5/20 18:09:53

为了详细说明ArrayList与LinkedList的特性和使用方法,下面我将分别展示如何使用这两个集合类,并通过简单的示例代码来体现它们的特点。

 

### 1. ArrayList 示例

 

```java

import java.util.ArrayList;

import java.util.List;

 

public class ArrayListExample {

    public static void main(String[] args) {

        // 创建ArrayList实例

        List<String> arrayList = new ArrayList<>();

 

        // 添加元素

        arrayList.add("Apple");

        arrayList.add("Banana");

        arrayList.add("Cherry");

 

        // 随机访问(通过索引)

        System.out.println("Element at index 1: " + arrayList.get(1)); // 快速访问

 

        // 在特定位置插入元素(效率较低)

        arrayList.add(1, "Blueberry");

 

        // 删除元素

        arrayList.remove("Banana"); // 按值删除

        arrayList.remove(2); // 按索引删除

 

        // 打印ArrayList

        System.out.println("ArrayList: " + arrayList);

    }

}

```

 

### 2. LinkedList 示例

 

```java

import java.util.LinkedList;

import java.util.List;

 

public class LinkedListExample {

    public static void main(String[] args) {

        // 创建LinkedList实例

        List<String> linkedList = new LinkedList<>();

 

        // 添加元素

        linkedList.add("Apple");

        linkedList.add("Banana");

        linkedList.addLast("Cherry"); // 特定方法添加到末尾

 

        // 随机访问(较慢)

        System.out.println("Element at index 1: " + linkedList.get(1));

 

        // 在头部插入元素(高效)

        linkedList.addFirst("Strawberry");

 

        // 删除元素

        linkedList.removeFirst(); // 高效地移除头部元素

        linkedList.remove(new String("Banana")); // 按值删除

 

        // 打印LinkedList

        System.out.println("LinkedList: " + linkedList);

    }

}

```

 

### 解析

 

- **ArrayList示例**展示了如何创建ArrayList对象、添加元素、通过索引快速访问元素、在特定位置插入和删除元素。通过索引访问和修改体现了ArrayList的优势,而插入和删除操作(特别是中间插入)则相对低效,因为可能需要移动后续元素。

 

- **LinkedList示例**同样展示了创建、添加、访问和删除元素的基本操作,但重点在于利用LinkedList特有的`addFirst`和`removeFirst`方法高效地在列表头部进行操作。同时,通过索引访问元素(如`get(1)`)相对较慢,因为需要从头节点开始遍历链表。

 

这些示例代码直观地展示了ArrayList和LinkedList的核心特性和使用方法,帮助您在实际编程中更好地选择和应用这两种数据结构。

当然,为了进一步深入理解ArrayList与LinkedList的差异,接下来我们将通过一些进阶示例,探讨它们在迭代、内存占用以及转换方面的表现。

 

### 3. 迭代性能比较

 

尽管ArrayList和LinkedList都实现了Iterable接口,可以使用增强for循环或迭代器进行遍历,但由于它们内部结构的不同,遍历效率也有所区别。

 

```java

import java.util.Iterator;

 

public class IterationPerformance {

    public static void iterateArrayList(ArrayList<String> arrayList) {

        long startTime = System.nanoTime();

        for (String item : arrayList) {

            // 遍历操作

        }

        long endTime = System.nanoTime();

        System.out.println("ArrayList iteration time: " + (endTime - startTime) + " ns");

    }

 

    public static void iterateLinkedList(LinkedList<String> linkedList) {

        long startTime = System.nanoTime();

        for (String item : linkedList) {

            // 遍历操作

        }

        long endTime = System.nanoTime();

        System.out.println("LinkedList iteration time: " + (endTime - startTime) + " ns");

    }

 

    public static void main(String[] args) {

        ArrayList<String> arrayList = new ArrayList<>();

        LinkedList<String> linkedList = new LinkedList<>();

 

        // 填充数据

        for (int i = 0; i < 10000; i++) {

            arrayList.add(String.valueOf(i));

            linkedList.add(String.valueOf(i));

        }

 

        iterateArrayList(arrayList);

        iterateLinkedList(linkedList);

    }

}

```

这段代码通过计时比较了遍历一个有10000个元素的ArrayList和LinkedList所需的时间。理论上,由于ArrayList的元素在内存中是连续存储的,现代CPU的高速缓存友好性可能导致其遍历速度略快于LinkedList,后者在遍历时可能需要更多的内存跳跃。

 

### 4. 内存占用分析

 

虽然直接通过代码难以直观展现内存占用情况,但可以通过理论分析来理解两者在内存使用上的差异:

 

- **ArrayList**不仅存储元素本身,还需要额外的空间来记录数组的长度和当前容量。此外,数组通常会有一定的容量冗余以备扩容,这可能导致ArrayList在元素数量较少时有较高的内存开销。

  

- **LinkedList**每个节点包含元素及两个引用(指向前一个和后一个节点),因此每个元素比ArrayList多出两个引用的内存消耗。但在元素数量较少时,LinkedList可能因不需要预留大量未使用的空间而显得更“经济”。

 

### 5. ArrayList与LinkedList转换

 

有时,根据操作需求的变化,你可能需要在ArrayList和LinkedList之间转换。Java提供了直接的构造函数来进行这种转换。

 

```java

public class ConvertCollections {

    public static void main(String[] args) {

        // 创建一个ArrayList

        ArrayList<String> arrayList = new ArrayList<>(Arrays.asList("A", "B", "C"));

 

        // 将ArrayList转换为LinkedList

        LinkedList<String> linkedList = new LinkedList<>(arrayList);

 

        // 反向转换

        ArrayList<String> convertedArrayList = new ArrayList<>(linkedList);

        

        System.out.println("Converted ArrayList: " + convertedArrayList);

        System.out.println("Converted LinkedList: " + linkedList);

    }

}

```

 

这段代码演示了如何通过构造函数直接将ArrayList转换为LinkedList,反之亦然。需要注意的是,转换操作会创建新的集合实例,原集合保持不变。

 

通过这些示例和分析,您可以更全面地掌握ArrayList与LinkedList的使用场景和性能特点,从而在实际开发中做出更加明智的选择。

### Java中的集合框架:深入探索ArrayList与LinkedList

在Java编程的世界里,集合框架无处不在,它为开发者提供了强大的数据结构和算法支持。本文将带您深入探讨Java集合框架中两个极其重要的实现——ArrayList和LinkedList,理解它们的内部工作原理、性能特点及适用场景,从而在实际开发中做出更加合适的选择。

#### 1. Java集合框架简介

Java集合框架位于`java.util`包下,是一个预构建的数据结构库,旨在提供高效的操作集合(如列表、集、映射等)的接口和实现。它主要包括三大接口:List、Set和Map,以及众多的具体实现类,如ArrayList、LinkedList、HashSet、HashMap等。

#### 2. ArrayList:动态数组的威力

**定义与特点:**
ArrayList是List接口的一个实现,底层使用可变大小的数组来存储元素。这意味着它提供了基于索引的快速访问(时间复杂度为O(1)),但插入和删除操作(尤其是列表中间的操作)可能较慢,因为可能需要移动后续的元素以保持连续性。

**优点:**
- **随机访问快**:由于使用数组存储,通过索引访问元素非常迅速。
- **自动扩容**:当数组容量不足以容纳新元素时,ArrayList会自动增加其容量,避免了频繁的手动管理内存。

**缺点:**
- **插入和删除效率低**:特别是在列表中间进行插入或删除时,需要移动大量元素。
- **线程不安全**:ArrayList不是线程安全的,多线程环境下需手动同步或使用`Vector`(线程安全的ArrayList旧版本)。

#### 3. LinkedList:链表的灵活性

**定义与特点:**
LinkedList也是List接口的实现,但与ArrayList不同,它使用双向链表作为基础数据结构。每个节点包含元素本身及其前后节点的引用,这使得在列表的任何位置添加或删除元素都非常高效。

**优点:**
- **高效的插入和删除**:在列表的开头或结尾添加/删除元素的时间复杂度为O(1),在列表中间操作虽然仍为O(n),但相比ArrayList,它不需要移动元素,只需改变引用即可。
- **额外功能**:由于链表的特性,LinkedList还实现了Deque接口,可以作为栈、队列或双端队列使用。

**缺点:**
- **随机访问慢**:由于需要从头节点开始遍历链表到达指定位置,因此通过索引访问元素的效率较低(时间复杂度为O(n))。
- **空间开销**:每个节点除了存储元素外,还需额外的空间存储前后节点的引用。

#### 4. 应用场景对比

- **ArrayList**适合于当您主要需要快速随机访问元素,且集合大小相对稳定,不频繁进行插入和删除操作的场景。
- **LinkedList**则更适合频繁进行插入和删除操作,特别是需要在列表两端高效执行这些操作,而对随机访问速度要求不高的场景。

#### 5. 总结

ArrayList和LinkedList各有千秋,选择哪个应根据具体的应用场景和需求来决定。理解它们的内部机制和性能特征,能够帮助我们更有效地利用Java集合框架,提升代码的性能和维护性。在实际开发中,合理选择数据结构是优化程序性能的关键步骤之一。希望本文能为您在Java集合框架的探索之旅上点亮一盏明灯。

 

 


http://www.mrgr.cn/p/23804140

相关文章

SpringBoot随手笔记

SpringBoot随手笔记 0 关于火狐浏览器什么时候会发出http请求的说明 在抓包的情况下(按下F12后的模式),不管是刷新页面还是在浏览器地址栏回车,该页面中的图片都会发出http请求; 但如果不是抓包的模式下,如果访问的页面和上一次访问的页面相同(地址栏的地址没有更改),不管是…

Maven随手笔记

1 当同时存在多个maven软件时,在windows上要如何区分?查看当前使用的是哪个maven的指令,mvn -v C:\Users\yangd>mvn -vApache Maven 3.6.3 (cecedd343002696d0abb50b32b541b8a6ba2883f)Maven home: D:\Java_developer_tools\Must_learn_must_know_technology\MavenProgra…

解决$‘\r‘: command not found 或syntax error near unexpected token `$‘\r‘的四个方法

问题原因&#xff1a; 两个报错原因都是Linux和windows下的回车换行符不兼容 解决方法&#xff1a; 方法一&#xff1a;在windows系统可以用文本编辑器查看所有字符&#xff0c;例如notepad&#xff0c;编辑->档案格式转换->转换为UNIX格式 方法二&#xff1a;在Linux系…

XN297 2.4GHz 单片高速无线收发芯片

概述 XN297是一款工作在2.400~2.483GHz世界通用ISM频段的单片无线收发芯片。该芯片集成 射频收发器、频率发生器、晶体振荡器、调制解调器等功能模块&#xff0c;并且支持一对多组网和带 ACK的通信模式。发射输出功率、工作频道以及通信数据率均可配置。 主要特性 1、低功…

爬虫:爬取豆瓣电影

文章目录 前言一、pandas是什么&#xff1f;二、使用步骤 1.引入库2.读入数据总结 前言 上篇我们将到如何利用xpath的规则&#xff0c;那么这一次&#xff0c;我们将通过案例来告诉读者如何使用Xpath来定位到我们需要的数据&#xff0c;就算你不懂H5代码是怎么个嵌套或者十分复…

springboot seata 全局捕获异常失效

问题:Spring boot使用@ControllerAdvice或@RestControllerAdvice全局捕获异常时,捕获不到自己抛出的相应异常 首先看一下全局异常组件有么有被扫描到如何查看,很简单只需要写一段类加载打印代码,如下 如果启动时,打印了你写的字符串就说明时烧苗到了 这就说明是其他的问题…

第二证券|炒股是波段好还是长期好?

炒股长时间比波段好一些&#xff0c;其原因如下&#xff1a; 1、长时间持有费用低 投资者在生意过程中&#xff0c;需求交纳必定的佣金费用、过户费用、印花税&#xff0c;而长时间持有股票&#xff0c;减少生意次数&#xff0c;能够节省一笔生意成本。 2、短期持有容易卖飞…

一种新的基于机器学习的示波法血压估计方法,开源、低功耗、低成本的人工智能软硬件提供者

具体的软硬件实现点击 http://mcu-ai.com/ MCU-AI技术网页_MCU-AI人工智能 血压的测量和预测是心脏病患者和有心脏问题的人的一个重要条件,应该保持持续的控制。在这项研究中,基于从使用袖带的个体获得的振荡波形,振荡波形分为三个周期。第一个周期是从起点到收缩压(SBP),第…

该做的都做了,但LCD还是啥都不显示

cubemx中不用配置lcd引脚&#xff0c;在lcd_init函数中就初始化好引脚了&#xff01;

已经有 Prometheus 了,还需要夜莺?

谈起当下监控,Prometheus 无疑是最火的项目,如果只是监控机器、网络设备,Zabbix 尚可一战,如果既要监控设备又要监控应用程序、Kubernetes 等基础设施,Prometheus 就是最佳选择。甚至有些开源项目,已经内置支持了 Prometheus 协议的指标暴露,比如新版本的 Zookeeper、新…

【懂车帝注册安全报告-无法登陆的背后是?】

前言 由于网站注册入口容易被黑客攻击&#xff0c;存在如下安全问题&#xff1a; 暴力破解密码&#xff0c;造成用户信息泄露 短信盗刷的安全问题&#xff0c;影响业务及导致用户投诉 带来经济损失&#xff0c;尤其是后付费客户&#xff0c;风险巨大&#xff0c;造成亏损无底洞…

如何使用python设计logo

如何使用Python设计Logo 一、引言 在这篇文章中,将介绍如何使用Python来设计一个简单的Logo。将使用Python的第三方库PIL(Python Imaging Library)来实现这个功能。PIL是一个强大的图像处理库,可以帮助轻松地处理各种图像操作,如缩放、旋转、裁剪等。 二、准备工作 在开始…

LLM生态下爬虫程序的现状与未来

LM出来后对爬虫程序有了新的要求,LLM也给爬虫带来了新的解决方案,本文分析Jina Reader和ScrapeGraphAI两块具有代表性的LLM时代的抓取工具功能、实现原理,带你看LLM时代的爬虫工具最近出现一批与LLM有关的新的爬虫框架,一类是为LLM提供内容抓取解析的,比如 Jina Reader 和…

信创基础软件之中间件

信创基础软件之中间件 中间件概述 中间件是一种应用于分布式系统的基础软件&#xff0c;位于应用与操作系统、数据库之间&#xff0c;主要用于解决分布式环境下数据传输、数据访问、应用调度、系统构建和系统集成、流程管理等问题&#xff0c;是分布式环境下支撑应用开发、运…

nature《自然》期刊文献怎么在家查看下载

nature《自然》期刊我们都知道&#xff0c;是世界上历史悠久的、最有名望的科学杂志之一。下载该期刊文献是需要使用权限的&#xff0c;如果你没有nature《自然》期刊的资源&#xff0c;又该如何获取呢&#xff1f;请看本文的经验分享。 一、先百度“文献党下载器” 在文献党下…

CentOS7.9个版本区别

CentOS7.9个版本区别

粤港澳青少年信息学创新大赛 Python 编程竞赛(初中部分知识点整理)

一、考试大纲梳理 知识内容 知识目标 计算机基础与编程环境&#xff0c;历史&#xff0c;存储与网络变量定义和使用基本数据类型&#xff08;整型&#xff0c;浮点型&#xff0c;字符型&#xff0c;布尔型&#xff09;&#xff0c;数据类型的转换控制语句结构&#xff08;顺序…

[附源码+视频教程]暗黑纪元H5手游_架设搭建_畅玩三网全通西方3D世界_带GM

本教程仅限学习使用&#xff0c;禁止商用&#xff0c;一切后果与本人无关&#xff0c;此声明具有法律效应&#xff01;&#xff01;&#xff01;&#xff01; 教程是本人亲自搭建成功的&#xff0c;绝对是完整可运行的&#xff0c;踩过的坑都给你们填上了 一. 演示视频 暗黑纪…

女朋友朋友圈发自己照片怎么评论呢视频

如何以视频形式评论女朋友朋友圈的自拍照 当女朋友在朋友圈分享她的自拍照时,用一段精心制作的视频来评论无疑是一个既创新又深情的方式。下面,我将为你提供一个关于如何制作这样一段视频的构想和指南。 首先,视频的开头可以是一段温馨的过渡,比如你们曾经一起度过的美好时…