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) {// 创建ArrayListArrayList<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) {// 创建LinkedListLinkedList<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适用于频繁插入和删除的场景。

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

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

相关文章

少儿编程:是智商税还是未来必备技能?

在当今这个科技日新月异的时代&#xff0c;编程已经成为了一项重要的技能。越来越多的家长开始关注少儿编程教育&#xff0c;希望孩子从小就能掌握这项技能。然而&#xff0c;也有一部分人认为少儿编程是一种“智商税”&#xff0c;认为这种教育方式并不适合所有孩子。那么&…

初识Pandas函数是Python的一个库(继续更新...)

学习网页&#xff1a; Welcome to Python.orghttps://www.python.org/https://www.python.org/https://www.python.org/ Pandas函数库 Pandas是一个Python库&#xff0c;提供了大量的数据结构和数据分析工具&#xff0c;包括DataFrame和Series等。Pandas的函数非常丰富&…

Java泛型(1)

我是南城余&#xff01;阿里云开发者平台专家博士证书获得者&#xff01; 欢迎关注我的博客&#xff01;一同成长&#xff01; 一名从事运维开发的worker&#xff0c;记录分享学习。 专注于AI&#xff0c;运维开发&#xff0c;windows Linux 系统领域的分享&#xff01; 本…

基于FFmpeg,实现播放器功能

一、客户端选择音视频文件 MainActivity package com.anniljing.ffmpegnative;import android.Manifest; import android.content.ContentResolver; import android.content.Context; import android.content.Intent; import android.database.Cursor; import android.net.Ur…

【每日一题】统计区间中的整数数目

文章目录 Tag题目来源解题思路方法一&#xff1a;平衡二叉搜索树 写在最后 Tag 【平衡二叉搜索树】【设计类】【2023-12-16】 题目来源 2276. 统计区间中的整数数目 解题思路 方法一&#xff1a;平衡二叉搜索树 思路 用一棵平衡二叉搜索树维护插入的区间&#xff0c;树中的…

Redis常用内存淘汰策略?

从淘汰范围来说可以分为不淘汰任何数据、只从设置了到期时间的键中淘汰和从所有键中淘汰三类。而从淘汰算法来分&#xff0c;又主要分为 random&#xff08;随机&#xff09;&#xff0c;LRU&#xff08;最近最少使用&#xff09;&#xff0c;以及 LFU&#xff08;最近最不常使…

Linux--LAMP 平台部署及应用

5.1 LAMP平台概述 LAMP架构是目前成熟的企业网站应用模式之一&#xff0c;指的是协同工作的一整套系统和相关软件&#xff0c;能够提供动态Web站点服务及其应用开发环境。LAMP是一个缩写词&#xff0c;具体包括Linux操作系统&#xff0c;Apache 网站服务器、MySQL数据库服务器&…

【人工智能 | 知识表示】问题规约法 谓词/符号逻辑,良好的知识表示是解题的关键!(笔记总结系列)

&#x1f935;‍♂️ 个人主页: AI_magician &#x1f4e1;主页地址&#xff1a; 作者简介&#xff1a;CSDN内容合伙人&#xff0c;全栈领域优质创作者。 &#x1f468;‍&#x1f4bb;景愿&#xff1a;旨在于能和更多的热爱计算机的伙伴一起成长&#xff01;&#xff01;&…

c#可变参数(params)关键字

通过使用 params 关键字&#xff0c;可以指定采用可变数量参数的方法参数。 可以发送参数声明中指定类型的参数的逗号分隔列表&#xff0c;也可以发送指定类型的参数数组。您也可以不发送任何参数。如果未发送任何参数&#xff0c;则参数列表的长度为零。 方法声明中的 param…

早上好,我的leetcode(第一期)

写在前面&#xff1a;每天早上到实验室早上昏昏欲睡&#xff0c;那不如写一题吧~ 文章目录 371. 两整数之和面试题08.05.递归乘法29.两数相除50.Pow(x,n)面试题 16.07. 最大数值2119. 反转两次的数字69. x 的平方根70.爬楼梯1631.最小体力消耗路径 371. 两整数之和 两整数之和…

基于ssm轻型卡车零部件销售平台源码和论文

随着信息化时代的到来&#xff0c;管理系统都趋向于智能化、系统化&#xff0c;轻型卡车零部件销售平台也不例外&#xff0c;但目前国内的市场仍都使用人工管理&#xff0c;市场规模越来越大&#xff0c;同时信息量也越来越庞大&#xff0c;人工管理显然已无法应对时代的变化&a…

Caused by: java.net.ConnectException: 拒绝连接: hadoop104/192.168.124.130:4142

项目场景&#xff1a;hadoop102接收消息&#xff0c;自定义拦截器&#xff0c;包含hello的发往hadoop103,不包含的发往hadoop104 报错原因&#xff1a; 原因1&#xff1a; 应该先开启接收方&#xff08;服务端&#xff09;&#xff0c;hadoop103,hadoop104,最后开启hadoop10…

QDialog子类的使用

背景&#xff1a; 我用Qt designer实现了如下效果&#xff1a; 但在实际使用的时候&#xff0c;发现OK和Cancel按钮点是点不动的。 解决方法&#xff1a; 需要手动添加相关信号槽函数&#xff1a; connect(ui.buttonBox, SIGNAL(accepted()), this, SLOT(accept()));connect…

yarn或者pnpm第一次执行的时候遇到报错yarn : 无法加载文件......因为在此系统上禁止运行脚本

报错&#xff1a; yarn : 无法加载文件 C:\Users\rina2\AppData\Roaming\npm\yarn.ps1&#xff0c;因为在此系统上禁止运行脚本。有关详细信息&#xff0c;请参阅 https:/http://go.microsoft.com/fwlink/?LinkID135170 中的 about_Execution_Policies。 解决方案&#xff1a…

AWS-CDN只能备用域名访问-使用Lambda@Edge(禁止分配的域名访问)

场景&#xff1a;cdn使用备用域名后&#xff0c;希望用户只能从备用域名访问&#xff0c;而不是自动分配的cdn域名&#xff0c;这也将是一个安全漏洞&#xff0c;被扫描到cdn域名访问刷流量等&#xff01; 【建议部署前查看】参考链接&#xff1a; 1.官方cdn返回示例 2.lambdae…

算法训练第三十九天|62. 不同路径、63. 不同路径 II

62. 不同路径&#xff1a; 题目链接 一个机器人位于一个 m x n 网格的左上角 &#xff08;起始点在下图中标记为 “Start” &#xff09;。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角&#xff08;在下图中标记为 “Finish” &#xff09;。 问总共有…

云服务配置docker镜像容器以及常用操作命令

首先通过ssh进入云服务器。如何ssh进入云服务器。 简单讲解一下docker中镜像和容器&#xff0c;打个比方&#xff0c;镜像相当于印钱的那个模板&#xff0c;容器相当于从模板上拓下来的钱&#xff0c;不同的模板可以印出不同的钱。但容器被修改后也可以变成新的镜像&#xff0…

Postman中参数填写方式

Postman中参数填写和请求方法有关&#xff0c;一般接口用例请求方法GET与POST常用&#xff0c;所以主要是这两种请求方法请求参数填写 一、GET请求方法参数填写 1、直接在URL中填写请求参数,如直接在URL中填写&#xff1a; http://www.example.com:8089/userapi?unamelisi&…

c++_01_名字空间_复合类型_缺省参数_哑元函数

0 前言 C和C一样&#xff0c;都属于编译型语言 C和C一样&#xff0c;都属于强类型语言 C对C完全兼容&#xff0c;并提供更多面向对象的特性&#xff1a;语言风格更加简洁&#xff0c;类型检查更加严格 1 名字空间 namespace WHY&#xff1f;划分更精细的逻辑单元(逻辑空间)&…

Faulhaber 2.5代运动控制系统 25mNm/13W

2.5代控制系统&#xff1b; PWM输出&#xff1b; 四象限控制带&#xff1b; RS232或CANopen通信接口&#xff1b; 2250_BX4_CxD 选件&#xff0c;电缆和连接信息&#xff1a; 适配部件&#xff1a;