【数据结构】ArrayList详解

news2024/11/20 11:46:43

目录

前言

1. 线性表

2. 顺序表

3. ArrayList的介绍和使用

3.1 语法格式

3.2 添加元素

3.3 删除元素

3.4 截取部分arrayList

3.5 其他方法

4. ArrayList的遍历

5.ArrayList的扩容机制

6. ArrayList的优缺点

结语


前言

在集合框架中,ArrayList就是一个普通的类,它实现了List接口。作为我们学习初阶数据结构的入门知识,ArrayList还是很好理解的,在学习它之前,我们也得先来简单了解下线性表以及顺序表

1. 线性表

线性表(Linear List)是零个或多个相同类型数据元素的有限序列。它是一种被广泛使用的数据结构,常见的线性表有:顺序表、链表、栈、队列……

线性表在逻辑上是线性结构,我们可以看作一条连续的直线,但是在物理结构上不一定是连续的,像顺序表,它在逻辑结构上和物理结构上都是连续的;而链表在物理结构上就不是连续的


2. 顺序表

从上面的图中我们可以看出,顺序表是物理结构和逻辑结构都连续的线性表,一般情况下采用数组存储,说白了,顺序表就是一个数组。ArrayList可以被认为是顺序表的一种实现


3. ArrayList的介绍和使用

3.1 语法格式

ArratList类位于java.util包当中,我们在使用前得先导包

import java.util.ArrayList;

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

又因为ArrayList实现了List接口,所以我们也可以用接口来引用ArrayList对象,List类也需要导包

import java.util.List;
import java.util.ArrayList;

List<E> list = new ArrayList<>();
  • E:泛型数据类型,为可以用来限制arrayList的类型,但是只能引用数据类型
  • 对于两种arrayList的创建,我更推荐使用第一种,这样能实现的方法也会更多 

除了以上两种构造(无参),其实还有另外两种构造方法 

//指定顺序表的初始容量
ArrayList<E> arrayList = new ArrayList<>(int initialCapacity);

//利用其他Collection构建ArrayList
ArrayList<E> arrayList = new ArrayList<>(Collection<? extends E> c);

我们经常使用的就是第一、二种,第三种比较少用到


3.2 添加元素

boolean add(E e):在列表尾处插入e

void add(int index,E element):将element插入到下标为index位置

        ArrayList<Integer> arrayList = new ArrayList<>();
        arrayList.add(1);
        arrayList.add(2);
        arrayList.add(3);
        System.out.println(arrayList);
        arrayList.add(1,200);
        System.out.println(arrayList);

而且我们还可以直接打印list,因为它已经重写了toString方法。运行结果如下 

boolean addAll(Collection<? extends E> c):尾插一组数据(可以是其他顺序表)

        ArrayList<Integer> arrayList1 = new ArrayList<>();
        arrayList1.add(1);
        arrayList1.add(2);
        arrayList1.add(3);
        ArrayList<Integer> arrayList2 = new ArrayList<>(arrayList1);
        System.out.println(arrayList2);

运行结果如下 


3.3 删除元素

E remove(int index):删除下标为index的元素

boolean remove(Object o): 删除遇到的第一个o元素

        ArrayList<Integer> arrayList = new ArrayList<>();
        arrayList.add(1);
        arrayList.add(2);
        arrayList.add(3);
        System.out.println(arrayList);
        arrayList.remove(1);//删除下标为1的元素
        arrayList.remove(Integer.valueOf(2));//删除值为2的元素
        System.out.println(arrayList););

 运行结果如下 

注意:当我们想通过值来删除元素的时候,传进去的值要记得装箱,也就是将基本类型转为引用类型。像上面的例子,我们想要删除元素2,就得传入Integer.valueOf(2)才能实现


3.4 截取部分arrayList

List<E> subList(int fromIndex,int toIndex):截取部分list(左闭右开)

  • 要注意,该方法返回类型为List<E>,所以我们必须用List<E>去引用过arrayList对象
  • 该方法实际上不是生成一个新的顺序表,而是直接引用了arrayList里的地址,所以当我们改变list里的值时,arrayList里的值也会发生改变
        ArrayList<Integer> arrayList = new ArrayList<>();
        arrayList.add(1);
        arrayList.add(2);
        arrayList.add(3);
        //截取部分list [左闭右开)
        List<Integer> list = arrayList.subList(0,2);
        System.out.println(list); //1,2
        //但是它并不是重新生成,而是指向同一引用
        list.set(0,100);
        System.out.println(arrayList);//arrayList里的元素也会被改变

运行结果如下

3.5 其他方法

有需要时就直接查询, 文档链接:ArrayList (Java SE 17 和 JDK 17) (oracle.com)


4. ArrayList的遍历

ArrayList有三种遍历方法:

  1. for循环
  2. foreach循环
  3. 使用迭代器
        ArrayList<Integer> arrayList = new ArrayList<>();
        arrayList.add(1);
        arrayList.add(2);
        arrayList.add(3);
        //打印一:for
        for (int i = 0; i < arrayList.size(); i++) {
            System.out.print(arrayList.get(i)+" ");
        }
        //打印二:foreach
        for (Integer x : arrayList) {
            System.out.print(x + " ");
        }
        System.out.println();

 运行结果如下


使用迭代器打印,我们就只能使用List<E>接口来引用arrayList,还有要导包

import java.util.Iterator; import java.util.ListIterator;

        //打印三:迭代器
        //默认是从 0 下标开始打印
        System.out.println("===Iterator===");
        Iterator<Integer> it =  arrayList.iterator();//创建迭代器
        while (it.hasNext()) {
            System.out.print(it.next() +" ");
        }
        System.out.println();

        System.out.println("===listIterator倒着打印===");
        //从 指定位置 开始打印     list1.size()
        ListIterator<Integer> it2 =  arrayList.listIterator(arrayList.size());
        while (it2.hasPrevious()) {
            System.out.print(it2.previous() +" ");
        }
        System.out.println();

运行结果如下

这个方法适当了解就行 


5.ArrayList的扩容机制

在前面的学习中,我们使用到了add()方法来添加元素,但我们在创建顺序表的时候却没有给它指定容量大小,它的大小肯定为0,那为什么还能正常添加而不报错呢?

其实ArrayList它是一个动态类型的顺序表,我们在插入元素的过程中,它会自动扩容,因此不需要我们担心容量太小而不够添加元素

6. ArrayList的优缺点

优点:因为ArrayList是一个顺序表,非常适合根据下标查找和更新的场景,此时的时间复杂度为O(1)

缺点:也正是因为ArrayList是一个顺序表,因此当我们想在任意位置插入或删除元素时,往往需要将后面一堆的元素进行移动,时间复杂度为O(n);再则,当我们想要存放数据是,它的扩容机制是为1.5倍或2倍扩容,这样可能会导致内存空间的浪费

结语

今天我们一起学习了ArrayList,知道了它的构造,使用方法,优缺点……而想要解决ArrayList的痛点,我们可以使用链表来规避这些问题,这就是我们下篇博文要写的内容,敬请期待吧

希望大家能喜欢这篇文章,有总结不到位的地方还请多多谅解,若有出现纰漏,希望大佬们看到错误之后能够在私信或评论区指正,博主会及时改正,共同进步!

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

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

相关文章

代码随想录第19天

654. 最大二叉树 已解答 中等 相关标签 相关企业 给定一个不重复的整数数组 nums 。 最大二叉树 可以用下面的算法从 nums 递归地构建: 创建一个根节点&#xff0c;其值为 nums 中的最大值。递归地在最大值 左边 的 子数组前缀上 构建左子树。递归地在最大值 右边 的 子数组后缀…

Mac 配置 Aria2

文章目录 1. Aria2 安装1.1 安装 brew1.2 安装 Aria2 2. 配置 Aria22.1 创建配置文件 aria2.conf 和空对话文件 aria2.session2.2 编辑配置文件 aria2.conf 3. 开机启动设置3.1 创建用户启动文件3.2 管理自启动项 4. 配置 BT tracker 自动更新4.1 XIU2/TrackersListCollection …

通义灵码-ai编码

https://developer.aliyun.com/topic/lingma/activities/202403?taskCode14508&recordIdb1ef3ba27250a5818b1b6ffe418af658#/?utm_contentm_fission_1 「通义灵码 体验 AI 编码&#xff0c;开 AI 盲盒」

sourcetree提交代码出现闪退报错(已解决)

当我在sourcetree提交代码时&#xff0c;点击提交按钮出现闪退关闭&#xff0c;并弹出下面的报错框&#xff0c;报错的图片如下&#xff1a; 那么经过了解&#xff0c;出现这样的报错原因是&#xff0c;git的提交时无法定位提交的人是谁&#xff0c;导致无法提交 那么解决的方…

Allavsoft for Mac v3.27.0.8852注册激活版 优秀的视频下载工具

Allavsoft for Mac是一款功能强大的多媒体下载和转换工具&#xff0c;支持从各种在线视频网站和流媒体服务下载视频、音频和图片。它具备批量下载和转换功能&#xff0c;可将文件转换为多种格式&#xff0c;以适应不同设备的播放需求。此外&#xff0c;Allavsoft还提供视频编辑…

ARM v8 Cortex R52内核 02 程序模型 Programmers Model

ARM v8 Cortex R52内核 02 程序模型 Programmers Model 2.1 关于程序模型 Cortex-R52处理器实现了Armv8-R架构。这包括&#xff1a; 所有的异常级别&#xff0c;EL0-EL2。 每个异常级别下的AArch32执行状态。 T32和A32指令集&#xff0c;其中包括&#xff1a; 浮点运算。 …

电子商务平台中大数据的应用|主流电商平台大数据采集API接口

(一)电商平台物流管理中大数据的应用 电商平台订单详情订单列表物流信息API接口应用 电子商务企业对射频识别设备、条形码扫描设备、全球定位系统及销售网站、交通、库存等管理软件数据进行实时或近实时的分析研究,提高物流速度和准确性。部分电商平台已建立高效的物流配送网…

Ruoyi-vue-pro Vue + nginx 二级目录部署到云服务器

http://www.your-server.com/ 这是一级目录&#xff0c;由于项目多&#xff0c;一般会通过二级域名http://oa.your-server.com/或二级目录http://www.your-server.com/oa来发布&#xff0c;本篇记录一下二级目录发布。先看效果 1、router/index.js配置base export default new …

Open CASCADE学习|在给定的TopoDS_Shape中查找与特定顶点 V 对应的TopoDS_Edge编号

enum TopAbs_ShapeEnum{TopAbs_COMPOUND,TopAbs_COMPSOLID,TopAbs_SOLID,TopAbs_SHELL,TopAbs_FACE,TopAbs_WIRE,TopAbs_EDGE,TopAbs_VERTEX,TopAbs_SHAPE}; 这段代码定义了一个名为 TopAbs_ShapeEnum 的枚举类型&#xff0c;它包含了表示不同几何形状类型的常量。这些常量通常…

5G网络架构及技术(二):OFDM一

ToDo: 等把这些讲义看完后得单开一个文章整理思维导图   该部分由于内容比较重要&#xff0c;OFDM是5G物理层的基础&#xff0c;但学习时直接跳到5G OFDM去看它的那些参数设置感觉没什么意义&#xff0c;还得从发展的角度进行学习&#xff0c;先从最先用到OFDM的WiFi协议开始…

最新版两款不同版SEO超级外链工具PHP源码

可根据个人感觉喜好自行任意选择不同版本使用&#xff08;版V1或版V2&#xff09; 请将zip文件全部解压缩即可访问&#xff01; 源码全部开源&#xff0c;支持上传二级目录访问 #已更新增加大量高质量外链&#xff08;若需要增加修改其他外链请打开txt文件&#xff09; #修…

隐私计算实训营学习八:隐语SCQL的开发实践

文章目录 一、SCQL使用集成最佳实践1.1 SCQL使用流程1.2 SCQL部署1.3 SCQL使用示例 二、SCQL工作原理三、使用SecretNote上手体验SCQL 一、SCQL使用集成最佳实践 1.1 SCQL使用流程 SCQL使用&#xff1a; SCQL 开放 API 供⽤户使⽤/集成。可以使⽤SCDBClient上⼿体验(类似与My…

基于R、Python的Copula变量相关性分析及AI大模型应用

在工程、水文和金融等各学科的研究中&#xff0c;总是会遇到很多变量&#xff0c;研究这些相互纠缠的变量间的相关关系是各学科的研究的重点。虽然皮尔逊相关、秩相关等相关系数提供了变量间相关关系的粗略结果&#xff0c;但这些系数都存在着无法克服的困难。例如&#xff0c;…

Docker实战教程 第1章 Linux快速入门

2-1 Linux介绍 为什么要学Linux 三个不得不学习 课程需要&#xff1a;Docker开发最好在Linux环境下。 开发需要&#xff1a;作为一个后端程序员&#xff0c;是必须要掌握Linux的&#xff0c;这是找工作的基础门槛。 运维需要&#xff1a;在服务器端&#xff0c;主流的大型服…

735.小行星碰撞

题目&#xff1a;给定一个整数数组 asteroids&#xff0c;表示在同一行的小行星。 对于数组中的每一个元素&#xff0c;其绝对值表示小行星的大小&#xff0c;正负表示小行星的移动方向&#xff08;正表示向右移动&#xff0c;负表示向左移动&#xff09;。每一颗小行星以相同…

设置你的第一个React应用

目录 一、React入门 1.1 你好React 1.2 创建React 1.3 应用结构 二、总结 2.1 定义组件 2.2 组件源码 三、组件详解 注意事项 3.1 组件三部曲 3.2 组件通信 —— props 3.3 对象数组迭代 —— map() 3.4 事件处理 3.5 钩子函数 —— useState() 初次学习最终效果…

递归实现指数型枚举(acwing)

题目描述&#xff1a; 从 1∼n 这 n 个整数中随机选取任意多个&#xff0c;输出所有可能的选择方案。 输入格式&#xff1a; 输入一个整数 n。 输出格式&#xff1a; 每行输出一种方案。 同一行内的数必须升序排列&#xff0c;相邻两个数用恰好 1 个空格隔开。 对于没有…

3d代理模型怎么转换成标准模型---模大狮模型网

在当今的虚拟世界中&#xff0c;3D建模技术被广泛运用于游戏开发、电影制作、工业设计等领域。在3D建模过程中&#xff0c;有时会遇到需要将代理模型转换成标准模型的情况。模大狮将从理论和实践两方面&#xff0c;介绍如何将3D代理模型转换成标准模型&#xff0c;以帮助读者更…

2_5.Linux存储的基本管理

实验环境&#xff1a; 系统里添加两块硬盘 ##1.设备识别## 设备接入系统后都是以文件的形式存在 设备文件名称&#xff1a; SATA/SAS/USB /dev/sda,/dev/sdb ##s SATA, dDISK a第几块 IDE /dev/hd0,/dev/hd1 ##h hard VIRTIO-BLOCK /de…

GD32F470_AS608光学指纹识别模块 指纹采集/STM32 51单片机模块移植

2.7 指纹识别传感器 光学指纹识别传感器采用了国内著名指纹识别芯片公司杭州晟元芯片技术有限公司(Synochip) 的 AS608 指纹识别芯片。芯片内置 DSP 运算单元&#xff0c;集成了指纹识别算法&#xff0c;能高效快速采集 图像并识别指纹特征。模块配备了串口、USB 通讯接口&…