ArrayList与LinkLIst

ArrayList

在Java中,ArrayListjava.util包中的一个类,它实现了List接口,是一个动态数组,可以根据需要自动增长或缩小。下面是ArrayList的一些基本特性以及其底层原理的简要讲解:

ArrayList基本特性:

  1. 动态数组: ArrayList是一个动态数组,它可以根据需要自动调整大小。

  2. 允许重复元素: ArrayList允许存储相同的元素,可以包含重复的值。

  3. 随机访问: 通过索引,可以以常数时间复杂度进行元素的访问,这是由于底层是数组实现。

  4. 不同步: ArrayList不是线程安全的,如果多个线程同时访问一个ArrayList实例,而至少有一个线程修改了列表结构,那么它必须保持外部同步。

API

boolean add(E element):将指定的元素添加到列表的末尾。
void add(int index, E element):在指定的位置插入指定的元素。
E get(int index)回列表中指定位置的元素。
int size():返回列表中的元素数。
boolean remove(Object o)从列表中删除指定的元素(如果存在)
E remove(int index)删除列表中指定位置的元素。
boolean contains(Object o)如果列表包含指定的元素,则返回 true。
void clear():从列表中删除所有元素。
boolean isEmpty():如果列表不包含元素,则返回 true。

ArrayList底层原理:

  1. 基于数组: ArrayList的底层是一个数组。当你创建一个ArrayList时,它会初始化一个数组来保存元素。初始时,默认大小是0的数组。当添加第一个元素的时候,底层会创建一个长度为10的数组

  2. 自动扩容: 当元素数量超过当前数组容量时,ArrayList会创建一个新的数组,将元素复制到新数组中,并更新引用。通常,新数组的大小是原数组的1.5倍。如果一次添加多个元素1.5倍放不下,则新建数组长度以实际长度为准

  3. 容量增长: ArrayList的容量增长不是按需一次性增长的,而是按照一定的策略进行递增。这样可以减少频繁扩容的开销。

  4. 元素的添加和删除: 在数组中,添加和删除元素可能涉及到移动其他元素,这可能导致性能开销。在某些情况下,特别是在大量操作的情况下,可能会考虑使用LinkedList,因为在链表中添加和删除元素的开销较小。

// 示例代码
import java.util.ArrayList;

public class ArrayListExample {
    public static void main(String[] args) {
        // 创建ArrayList
        ArrayList<String> arrayList = new ArrayList<>();

        // 添加元素
        arrayList.add("Java");
        arrayList.add("Python");
        arrayList.add("C++");

        // 访问元素
        System.out.println("First element: " + arrayList.get(0));

        // 删除元素
        arrayList.remove("Python");

        // 打印所有元素
        System.out.println("All elements: " + arrayList);
    }
}

总体而言,ArrayList是一个灵活且性能良好的集合类,适用于大多数元素的存储和检索场景。


LinkList

LinkedList是Java集合框架中的另一种实现List接口的类,它基于链表数据结构。相比于ArrayListLinkedList在一些操作上有不同的性能特点。

LinkedList的基本特性:

  1. 基于链表: LinkedList使用双向链表实现,每个元素都包含一个指向前一个元素和一个指向后一个元素的引用。这使得在链表中插入和删除元素更为高效,因为不需要移动其他元素。

  2. 不适合随机访问: 由于是链表结构,LinkedList在随机访问元素时效率较低。访问某个特定位置的元素需要从头或尾开始遍历链表。

  3. 元素添加和删除高效: 在链表中插入和删除元素的操作相对较快,因为只需要更新相邻元素的引用,而不需要像数组一样移动大量元素。

  4. 不同步: LinkedList也是非线程安全的,如果需要在多线程环境中使用,需要进行外部同步。

API

boolean add(E element)将指定的元素添加到列表的末尾。
void add(int index, E element)在指定的位置插入指定的元素
E get(int index):返回列表中指定位置的元素
E getFirst()返回列表中的第一个元素
E getLast():返回列表中的最后一个元素。
boolean remove(Object o)从列表中删除指定的元素(如果存在)
E remove(int index):删除列表中指定位置的元素。
E removeFirst():删除并返回列表的第一个元素
E removeLast()删除并返回列表的最后一个元素
boolean contains(Object o)如果列表包含指定的元素,则返回 true。
void clear()从列表中删除所有元素
E set(int index, E element):用指定的元素替换列表中指定位置的元素。
boolean isEmpty():如果列表不包含元素,则返回 true。
int indexOf(Object o)返回列表中第一次出现的指定元素的索引;如果列表不包含此元素,则返回
boolean offer(E e)将指定的元素添加到列表的末尾(队尾)。
E poll():检索并删除列表的头部(队首)元素。
void push(E e):将元素推入列表所表示的堆栈(在列表的头部)。
E pop():从列表所表示的堆栈中弹出第一个元素。
Object[] toArray():返回包含列表中所有元素的数组。

示例代码:

import java.util.LinkedList;

public class LinkedListExample {
    public static void main(String[] args) {
        // 创建LinkedList
        LinkedList<String> linkedList = new LinkedList<>();

        // 添加元素
        linkedList.add("Java");
        linkedList.add("Python");
        linkedList.add("C++");

        // 访问元素
        System.out.println("First element: " + linkedList.getFirst());

        // 删除元素
        linkedList.remove("Python");

        // 打印所有元素
        System.out.println("All elements: " + linkedList);
    }
}

适用场景:

  • 当需要频繁执行插入和删除操作时,特别是在列表的中间位置。
  • 当对列表进行迭代操作而不是随机访问时。

总体而言,LinkedListArrayList各有优势,选择取决于具体的使用场景。ArrayList适用于随机访问和大量元素的存储,而LinkedList适用于频繁插入和删除的场景。

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

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

相关文章

科大讯飞(深圳)测开面试真题

一面&#xff08;测试组长面&#xff09; 1、上家公司项目以及团队的规模是怎么样的&#xff1f; 2、你负责的项目整体的流程是怎么样的&#xff1f; 3、自动化实施过程中&#xff0c;是如何和业务测试进行沟通的&#xff1f; 4、在上家公司你已经是专职做自动化了&#xf…

会声会影怎么使用? 会声会影2024快速掌握入门技巧

一听说视频剪辑我们就不由得联想到电影、电视等一些高端的视频剪辑技术&#xff0c;大家都觉得视频剪辑是一个非常复杂而且需要很昂贵的设备才可以完成的技术活&#xff0c;这对很多“门外汉”来说都可望而不可及。实际上&#xff0c;使用会声会影剪辑视频不仅是很多人都可以操…

《面向机器学习的数据标注规程》摘录

说明&#xff1a;本文使用的标准是2019年的团体标准&#xff0c;最新的国家标准已在2023年发布。 3 术语和定义 3.2 标签 label 标识数据的特征、类别和属性等。 3.4 数据标注员 data labeler 对待标注数据进行整理、纠错、标记和批注等操作的工作人员。 【批注】按照定义…

【话题】低代码123

目录 一、什么是低代码 二、低代码的优缺点 三、你认为低代码会替代传统编程吗&#xff1f; 四、有哪些低代码工具和框架 4.1 国外的平台 4.2 国内的平台 五、未来的软件研发 低代码&#xff0c;听着就过瘾的一个词。而且不是无代码&#xff0c;这说明&#xff0c;低代码…

GoogLeNet(pytorch)

亮点与创新&#xff1a; 1. 引入Inception基础结构 2. 引入PW维度变换卷积&#xff0c;启迪后续参数量的优化 3. 丢弃全连接层&#xff0c;使用平均池化层&#xff08;大大减少模型参数&#xff09; 4. 添加两个辅助分类器帮助训练&#xff08;避免梯度消失&#xff0c;用于…

方舟无限ARX-5臂的奇异验证

事情起因是&#xff0c;某技术人员号称这款机械臂无奇异点&#xff0c;博主当场一个【黑人问号脸】。 既然是串联臂&#xff0c;大概很难做到无奇异点~ 为了反驳&#xff0c;博主建模简单分析了下&#xff0c;偏置参数随便写了个&#xff0c;具体验证程序见文末。 clear,clc,…

共同编辑文档功能实现(websocket)

目录 前言 websocket封装 wangeditor下载 共同编辑文档代码实现 HTML样式部分 JS部分 css部分 前言 功能&#xff1a;实现文档共同编辑功能&#xff0c;可以实时接收到其他人的信息 思路&#xff1a;先调用接口获取相应的数据进行渲染&#xff0c;然后通过webSocket建…

C#基础知识 - 基本语法篇

C#基础知识-基本语法篇 第2节 C#基本语法2.1 C#程序结构2.2 C# 结构解析2.3 命名空间及标识符、关键字2.3.1 别名的使用2.3.2 标识符2.3.3 C#关键字 更多C#基础知识详解请查看&#xff1a;C#基础知识 - 从入门到放弃 第2节 C#基本语法 2.1 C#程序结构 “Hello, World”程序历…

棋牌的电脑计时计费管理系统教程,棋牌灯控管理软件操作教程

一、前言 有的棋牌室在计时的时候&#xff0c;需要使用灯控管理&#xff0c;在开始计时的时候打开灯&#xff0c;在结账后关闭灯&#xff0c;也有的不需要用灯控&#xff0c;只用来计时。 下面以 佳易王棋牌计时计费管理系统软件为例说明&#xff1a; 软件试用版下载或技术支…

Java架构师系统架构高可用维度分析

目录 1 导语2 可用性介绍3 本地高可用-集群、分布式4 本地高可用-数据逻辑保护5 异地容灾-双活、两地三中心6 异地容灾-DRP规划&BCP业务连续性7 多活和妥协方案8 高可用流程9 总结想学习架构师构建流程请跳转:Java架构师系统架构设计 1 导语 Java架构师在进行系统架构设…

ELk(七)—部署Nginx

目录 部署Nginxfilebeat启动Nginx模块Module对nginx模块配置进行修改修改nginx-log.yml配置文件 部署Nginx 下面是nginx的安装脚本&#xff0c;里面的参数可以根据实际需要进行修改。 #!/bin/bash#新建一个文件夹用来存放下载的nginx源码包mkdir -p /opt/nginx cd /opt/nginx…

Android Studio 软件如何将系统自带的标题栏隐藏

目录 一、实现效果 二、开发环境 三、实现方法 ①首先创建一个新的项目 ②打开你需要隐藏标题栏的Activity ③我们看下正常的显示效果 ④然后在onCreate中进行代码编写 ⑤点击运行查询看效果 三、Android Studio 模板 一、实现效果 二、开发环境 三、实现方法 在Andro…

千帆竞渡,鸿蒙已过万重山

近期&#xff0c;华为宣布其自主研发的鸿蒙Next系统将不再兼容Android系统&#xff0c;而是完全独立运营。 也就是说&#xff0c;你的 Android APK 已经不能在 HarmonyOS NEXT 上运行&#xff0c;因为系统已经不存在 AOSP 代码&#xff0c;甚至没有 JVM。 此举意味着鸿蒙系统…

pytorch网络的增删改

本文介绍对加载的网络的层进行增删改, 以alexnet网络为例进行介绍。 1. 加载网络 import torchvision.models as models alexnet models.alexnet(weightsmodels.AlexNet_Weights.DEFAULT) print(alexnet)2. 删除网络 在做迁移学习的时候&#xff0c;我们通常是在分类网络的…

为uniDBGrid设置文字操作栏

为uniDBGrid设置文字操作栏&#xff0c;如下图的效果&#xff0c;用户点击审核&#xff0c;执行审核代码&#xff0c;点退回&#xff0c;执行退回代码&#xff1a; 对于Web应用界面&#xff0c;这是最常见的方式&#xff0c;那对于我等Delphi开发者来说&#xff0c;基于uniGUI该…

贝蒂详解<string.h>哦~(用法与实现)

目录 引言&#xff1a; &#xff08;一&#xff09;字符函数和字符串函数 1.简介 2.strlen()函数 2.1用法 2.2实例 2.3 实现strlen() &#xff08;1&#xff09;计数法 &#xff08;2&#xff09;递归法 &#xff08;3&#xff09; 指针-指针 2.4sizeof和strlen()的区别 3.s…

车规MCU应用场景及国产替代进展

目录 1.车规MCU应用场景 1.1 车身域 1.2 动力底盘域 1.3 座舱域和智驾域 1.4 网联域 2.国产替代进展 3.小结 前面一篇文章征途漫漫:汽车MCU的国产替代往事-CSDN博客对车规MCU国产替代的背景与一些往事进行了简单叙述&#xff0c;今天来聊聊车规MCU具体会在汽车哪些地方用…

金智融门户(统一身份认证)同步数据至钉钉通讯录

前言:因全面使用金智融门户和数据资产平台,二十几个信息系统已实现统一身份认证和数据同步,目前单位使用的钉钉尚未同步组织机构和用户信息,职工入职、离职、调岗时都需要手工在钉钉后台操作,一是操作繁琐,二是钉钉通讯录更新不及时或经常遗漏,带来管理问题。通过金智融…

基于JavaEE智能实时疫情监管服务平台设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用JSP技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…

ES-模糊查询

模糊查询 1 wildcard 准备数据 POST demolike/_bulk {"index": {"_id": "1"} } {"text": "草莓熊是个大坏蛋" } {"index": {"_id": "2"} } {"text": "wolf 也是一个坏蛋&q…