LinkedList和ArrayList对比各有什么优势?

news2024/9/29 11:31:20

一、LinkedList的概述

1. LinkedList是双向链表实现的List

2. LinkedList是非线程安全的

3. LinkedList元素允许为null,允许重复元素

4. LinkedList是基于链表实现的,因此插入删除效率高,查找效率低(虽然有一个加速动作)

5. LinkedList是基于链表实现的,因此不存在容量不足的问题,所以没有扩容的方法

6. LinkedList还实现了栈和队列的操作方法,因此也可以作为栈、队列和双端队列来使用。推荐了解java培训课程。


二、LinkedList的分析

2.1LinkedList的存储结构

LinkedList是由双链表的数据结构组成的

public class LinkedList{

    // 元素个数

    transient int size = 0;

    /**

    * 指向第一个节点的指针

    * 不变性:

    * 1. 如果first = null,则last=null

    * 2. 如果first.prev == null,则first.item != null

    */

    transient Node<E> first;

    /**

    * 指向最后一个节点的指针

    * 不变性:

    * 1. 如果first = null,则last = null

    * 2. 如果last.next == null,则last.item != null

    */

     transient Node<E> last;

     private static class Node<E> {

        E item;

        Node<E> next; // 下一个Node的引用

        Node<E> prev; // 上一个Node的引用

        Node(Node<E> prev, E element, Node<E> next) {

            this.item = element;

            this.next = next;

            this.prev = prev;

        }

}

/**

  * 创建一个空list

  * */

    public LinkedList() {

    }

    public LinkedList(Collection<? extends E> c) {

        this();

        addAll(c);

    }

}


2.2添加元素

2.2.1从头部添加

// 从头插入

public void addFirst(E e) {

    linkFirst(e);

}

private void linkFirst(E e) {

    final Node<E> f = first;

    final Node<E> newNode = new Node<>(null, e, f);

    first = newNode;

    if (f == null) // 当前List中没有元素,size=0

        last = newNode;

    else

        f.prev = newNode;

    size++;

    modCount++;

}


2.2.2从尾部添加

public boolean add(E e) {

    linkLast(e);

    eturn true;

}

public void addLast(E e) {

    linkLast(e);

}

void linkLast(E e) {

    final Node<E> l = last;

    final Node<E> newNode = new Node<>(l, e, null);

    last = newNode;

    if (l == null)// 当前List中没有元素,size=0

        first = newNode;

    else

        l.next = newNode;

    size++;

    modCount++;

}

2.3.删除节点

2.3.1从头部删除

// 移除首节点,并返回该节点的元素值

public E remove() {

    return removeFirst();

}

public E removeFirst() {

    final Node<E> f = first;

    if (f == null)

    throw new NoSuchElementException();

    return unlinkFirst(f);

}

// 删除首节点f

private E unlinkFirst(Node<E> f) {

    final E element = f.item;

    final Node<E> next = f.next;

    f.item = null;

    f.next = null; // help GC

    first = next;

    if (next == null) // size=1

        last = null;

    else

        next.prev = null;

    size--;

    modCount++;

    return element;

}


2.3.2从尾部移除


2.3.3根据索引移除

public E remove(int index) {

    checkElementIndex(index);// 检查索引index范围

    return unlink(node(index));

}

E unlink(Node<E> x) {

    final E element = x.item;

    final Node<E> next = x.next;

    final Node<E> prev = x.prev;

    if (prev == null) {// x为首节点

        first = next;

    } else {

        prev.next = next;

        x.prev = null;

   }

    if (next == null) {// x为尾节点

        last = prev;

    } else {

        next.prev = prev;

        x.next = null;

    }

    x.item = null;

    size--;

    modCount++;

    return element;

}

2.4获取节点数据

2.4.1获取头部数据
// 获取首节点的数据

public E getFirst() {

    final Node<E> f = first;

    if (f == null)

    throw new NoSuchElementException();

    return f.item;

}

2.4.2获取尾部数据
// 获取尾节点的数据

public E getLast() {

    final Node<E> l = last;

    if (l == null)

    throw new NoSuchElementException();

    return l.item;

}

2.4.3根据索引获取节点数据

// 获取索引对应节点的数据

public E get(int index) {

    checkElementIndex(index);

    return node(index).item;

}

// 类似折半查找

Node<E> node(int index) {

    if (index < (size >> 1)) {// 从前半部分查找

    Node<E> x = first;

    for (int i = 0; i < index; i++)

    x = x.next;

   return x;

    } else {// 从后半部分查找

        Node<E> x = last;

        for (int i = size - 1; i > index; i--)

        x = x.prev;

        return x;

    }

}


三、总结:LinkedList和ArrayList的比较

1. 顺序插入速度ArrayList会比较快,因为ArrayList是基于数组实现的,数组是事先new好的,只要往指定位置塞一个数据就好了

2. LinkedList则不同,每次顺序插入的时候LinkedList将new一个对象出来,如果对象比较大,那么new的时间势必会长一点,再加上一些引用赋值的操作,所以顺序插入LinkedList必然慢于ArrayList

3. ArrayList的遍历效率会比LinkedList的遍历效率高一些

4. LinkedList做插入、删除的时候,慢在寻址,快在只需要改变前后Node的引用地址

5. ArrayList做插入、删除的时候,慢在数组元素的批量copy,快在寻址

(1) 如果确定插入、删除的元素是在前半段,那么就使用LinkedList

(2) 如果确定插入、删除的元素在比较靠后的位置,那么可以考虑使用ArrayList

(3) 如果不能确定插入、删除是在哪儿呢?建议使用LinkedList,

·一来LinkedList整体插入、删除的执行效率比较稳定,没有ArrayList这种越往后越快的情况

·二来插入元素的时候,弄得不好ArrayList就要进行一次扩容,而ArrayList底层数组扩容是一个既消耗时间又消耗空间的操作

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

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

相关文章

宜明昂科上市申请“失效”:融资数据“打架”,田文志持股约20%

12月29日&#xff0c;贝多财经从港交所披露易了解到&#xff0c;宜明昂科生物医药技术&#xff08;上海&#xff09;股份有限公司&#xff08;下称“宜明昂科”&#xff09;在港交所递交的上市申请材料已经“失效”&#xff0c;目前已正常无法查看或下载。 其中&#xff0c;招股…

C++图论 最小生成树和二分图问题总结

目录 一、最小生成树 &#xff08;一&#xff09;Prim朴素版 思路 练习题 代码 &#xff08;二&#xff09;kruskal算法 练习题 代码 二、二分图 &#xff08;一&#xff09;染色法判定二分图 练习题 代码 &#xff08;二&#xff09;匈牙利算法 练习题 代码 一、…

CSDN官方开发工具利器猿如意实测

目录前言一.ChatGPT二.效率工具三.开发工具四.教程文档五.一行代码六.总结前言 猿如意 是CSDN官方2022年推出的面向程序员效率工具集合&#xff0c;里面包含非常实用的小工具&#xff08;如Linux命令查询、语音合成、Json格式化、Host切换、文字转图片、Postman、图片处理等&a…

Linux 快照 (snapshot) 原理与实践(一) 快照基本原理

文章目录0. 背景1. 如何理解快照(snapshot)?2. 快照 (snapshot) 的原理2.1 全量快照1. 克隆 (Clone)2. 镜像分离 (Split Mirror)2.2 增量快照1. 写时拷贝(Copy-On-Write)**写数据****读数据****优缺点**2. 写时重定向 (Redirect-On-Write)**写数据****读数据**优缺点3. Linux …

电脑免费录屏软件有哪些?5款视频录制软件免费版

在日常生活工作与学习中&#xff0c;都会经常遇到需要录制屏幕的情况&#xff0c;比如录制线上会议纪要记录、老师授课内容、游戏画面、线上直播等&#xff1b;在众多网络网友录屏软件分享下&#xff0c;有哪些电脑录屏软件是好用的&#xff1f;今天小编就给大家分享5款觉得还不…

最短编辑距离

最短编辑距离一、问题描述二、思路分析1、状态转移方程&#xff08;1&#xff09;状态表示&#xff08;2&#xff09;状态转移2、循环及初始化&#xff08;1&#xff09;循环设计&#xff08;2&#xff09;初始化处理三、代码实现一、问题描述 二、思路分析 这道题是一道DP的问…

oh my 毕设-人体姿态估计-简介应用场景

毕设题目为人体姿态估计&#xff0c;之前主要关注在目标检测上&#xff0c;这方面不太熟悉&#xff0c;于是想做一个系列专栏&#xff0c;从0到1学习姿态估计。 参考于大佬-同济子豪兄 姿态估计本质是关键点检测。 人体姿态的估计常常首先预测出人体各个关键点的位置坐标&am…

160.相交链表

给你两个单链表的头节点 headA 和 headB &#xff0c;请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点&#xff0c;返回 null 。 图示两个链表在节点 c1 开始相交&#xff1a; 题目数据 保证 整个链式结构中不存在环。 注意&#xff0c;函数返回结果后&…

开启 kerberos 后,HiveServer2 的 webui 没有内容的解决方案

开启 kerberos 后&#xff0c;HiveServer2 的 webui 没有内容。页面如下&#xff0c;可以打开&#xff0c;但是即便已经有会话&#xff0c;也有SQL执行&#xff0c;这里一直这样。 1. 原因分析 1.1 hiveserver2.jsp 以Active Sessions 的内容为例&#xff0c;./service/src…

electron起步基本和electron打包 无脑步骤(修改electron图标)

1.安装 yarn add electron --dev 和 yarn add nodemon --dev 2.在package.json 写main入口和启动脚本 "main":"main.js", "start": "nodemon --exec electron . --watch ./ --ext .js,.html,.css,.vue" "license": "…

oracle在本地创建数据库和导入DMP数据泵

第一步&#xff1a;创建本地数据库 databse Configuration Assistant&#xff0c;创建数据库。 下一步之后完成。 通常在创建数据库时会报错&#xff0c;如图&#xff0c;直接跳过&#xff0c;在net manager的Listener下添加一个新的地址&#xff0c;协议名填写警告日志中Prot…

关于mmpose

为什么是关于mmpose呢&#xff0c;因为我菜。本文仅做记录使用&#xff0c;也就是说&#xff0c;写的不一定对&#xff0c;欢迎大佬批评指正。 我只想知道这种关键点检测是如何标注的&#xff0c;数据集是如何搞的&#xff0c;全网居然都找不到&#xff0c;付费资源我不配&…

Android设计模式详解之装饰模式

前言 装饰模式也称为包装模式&#xff0c;结构型设计模式之一&#xff1b; 定义&#xff1a;动态地给一个对象添加一些额外的职责。就增加功能来说&#xff0c;装饰模式生成子类更为灵活&#xff1b; 使用场景&#xff1a;需要透明且动态地扩展类的功能时&#xff1b; UML类…

零经验出海报单,看跨境电商小白如何在Starday突出重围

随着大数据、云计算等一系列新颖先进的技术概念引入&#xff0c;全球经济市场呈现出以往难以想象的活跃&#xff0c;世界各地的贸易订单都可以借助互联网渠道在数秒内完成全流程。“跨境电商”这一概念正是全球互联网技术普及应用下的附属品&#xff0c;更是经济全球化时代发展…

第五章. 可视化数据分析图表—Seaborn图表(线性回归模型,箱型图,核密度图,提琴图)

第五章. 可视化数据分析图 5.7 Seaborn图表 Seaborn是一个基于Matplotlib的高级可视化效果库&#xff0c;偏向于统计图表&#xff0c;主要针对的是数据挖掘和机器学习中的变量特征选取&#xff0c;相比Matplotlib&#xff0c;他的语法相对简单&#xff0c;但是具有一定的局限性…

《Java高并发与集合框架》第三部分在高并发场景中工作的集合

《Java高并发与集合框架》第三部分在高并发场景中工作的集合前言1.高并发场景中的List、Map和Set集合1.1 CopyOnWriteArrayList1.2 CopyOnWriteArrayList不支持的使用场景1.3 CopyOnWriteArrayList主要方法1.4 java.util.Collections.synchronizedList()方法的补充作用1.4.1 Co…

Allegro如何实现交换pin操作详细指导

Allegro如何实现交换pin操作详细指导 在做PCB设计的时候,换pin是用的较多的功能,换pin可以让线序更加的顺,方便布线。但是前提是确保网络的交换是被允许的 下面用下图为例介绍Allegro中是如何实现交换pin的 具体操作如下 选择File选择Export-Libraries

2022年终,盘点IT行业全年10大事件

白云苍狗&#xff0c;一眨眼&#xff0c;2022年就来到了尾声。这一年里&#xff0c;IT行业发生了不少的大事。有喜有忧&#xff0c;令人目不暇接&#xff0c;显现出IT行业风云变幻的一面。 本期&#xff0c;知了姐为大家整理了近一年来&#xff0c;IT行业发生的10件大事。 NO…

Linux下安装mysql

下载地址&#xff1a; https://dev.mysql.com/downloads/mysql/ 1.解压mysql 文件包&#xff0c;解压路径/home/mysql tar -zxvf mysql-8.0.31-linux-glibc2.12-x86_64.tar 2.编写配置 [client] #password your_password port 3306 socket /home/mysql/…

无线网络监控分析工具

多年来&#xff0c;网络设备已经从房间大小的机器急剧转变为小型便携式设备。随着设备尺寸发生巨大变化&#xff0c;将这些设备相互连接所涉及的技术也发生了巨大变化。这些剧烈变化的结果是无线网络的形成。无线网络的优势在于网络中的各种设备之间不需要物理连接。此外&#…