Java数据结构之ArrayList(如果想知道Java中有关ArrayList的知识点,那么只看这一篇就足够了!)

        前言:ArrayList是Java中最常用的动态数组实现之一,它提供了便捷的操作接口和灵活的扩展能力,使得在处理动态数据集合时非常方便。本文将深入探讨Java中ArrayList的实现原理、常用操作以及一些使用场景。


✨✨✨这里是秋刀鱼不做梦的BLOG

✨✨✨想要了解更多内容可以访问我的主页秋刀鱼不做梦-CSDN博客

在文章开始之前,先让我们看一下本文的大致内容:

目录

1.认识ArrayList

2.ArrayList的创建

(1)使用默认构造函数创建一个空的 ArrayList:

(2)使用带有初始容量的构造函数创建 ArrayList:

(3)使用 ArrayList(Collection c) 构造函数创建 ArrayList 的简单示例:

3.ArrayList的遍历

遍历ArrayList的方式:

        (1)使用for循环

        (2)使用增强型for循环:

        (3)使用迭代器

4.ArrayList常用API

        (1)boolean add(E e)——尾插 e

        (2)void add(int index, E element)——将 e 插入到 index 位置

        (3)boolean addAll(Collection c)——尾插 c 中的元素

        (4)E remove(int index)——删除 index 位置元素

        (5)boolean remove(Object o)——删除遇到的第一个 o

        (6)E get(int index)——获取下标 index 位置元素

        (7)E set(int index, E element)——将下标 index 位置元素设置为 element

        (8)void clear()——清空

        (9)boolean contains(Object o)——判断 o 是否在线性表中

        (10)int indexOf(Object o)——返回第一个 o 所在下标

        (11)int lastIndexOf(Object o)——返回最后一个 o 的下标

        (12)List subList(int fromIndex, int toIndex)——截取部分 list


1.认识ArrayList

        在正式的学习ArrayList之前,我们需要了解一下什么是Java中的ArrayList(顺序表):

        ArrayList是Java中的一个动态数组类,它实现了List接口,可以存储任意类型的对象,并且大小可以动态地调整。ArrayList允许在列表的任意位置进行元素的插入、删除、获取等操作,而且它还能自动扩展内部数组的容量,以适应存储需求的增长。

ArrayList是一个普通的类,实现了List接口,具体框架图如下:

读到这就会有读者发问了,ArrayList到底是怎么去实现这些功能的呢?,它的底层原理到底是怎么样的呢?答案如下:

ArrayList的实现原理:

        ArrayList的内部实现是基于数组的,它使用一个Object类型的数组来存储元素。当创建一个ArrayList实例时,会初始化一个默认大小的数组,当数组容量不足以存储新的元素时,ArrayList会自动扩展数组的大小,通常会将当前数组的容量增加一倍,并将原来的元素复制到新数组中,当然其他的操作也是类似。

通过上面的描述,我们就大致的了解了Java中ArrayList(顺序表)了。

2.ArrayList的创建

        了解完了Java中ArrayList(顺序表),那么我们如何去创建并使用它呢?在Java中给我们提供了三种创建ArrayList(顺序表)的方式。

创建方式解释
ArrayList()无参构造
ArrayList(int initialCapacity)指定顺序表初始容量
ArrayList(Collection<? extends E> c)利用其他 Collection 构建 ArrayList

现在让我们使用三种不同的方式来创建一下ArrayList(顺序表):
 

(1)使用默认构造函数创建一个空的 ArrayList:

import java.util.ArrayList;public class Main {public static void main(String[] args) {// 创建一个空的 ArrayListArrayList<String> list1 = new ArrayList<>();// 添加元素到 ArrayList(这里可以先看一下就可以)list1.add("Apple");list1.add("Banana");list1.add("Orange");// 打印 ArrayListSystem.out.println("ArrayList 1: " + list1);}
}

(2)使用带有初始容量的构造函数创建 ArrayList:

import java.util.ArrayList;public class Main {public static void main(String[] args) {// 创建一个具有初始容量的 ArrayListArrayList<Integer> list2 = new ArrayList<>(5);// 添加元素到 ArrayList(这里先看一下就可以)list2.add(10);list2.add(20);list2.add(30);// 打印 ArrayListSystem.out.println("ArrayList 2: " + list2);}
}

(3)使用 ArrayList(Collection<? extends E> c) 构造函数创建 ArrayList 的简单示例:

import java.util.ArrayList;
import java.util.List;public class Main {public static void main(String[] args) {// 创建一个包含初始元素的集合List<String> originalList = new ArrayList<>();originalList.add("Apple");originalList.add("Banana");originalList.add("Orange");// 使用原始集合创建一个新的 ArrayListArrayList<String> newList = new ArrayList<>(originalList);// 打印新的 ArrayListSystem.out.println("New ArrayList: " + newList);}
}

这样我们就了解了如何在Java中创建ArrayList(顺序表)了。

3.ArrayList的遍历

        在认识ArrayList的段落中,我们知道了ArrayList的底层是一个动态数组,既然是数组的话,我们是不是可以像遍历数组一样遍历ArrayList呢?答案是——是的,但是在此之上我们还可以使用迭代器对其进行遍历。

遍历ArrayList的方式:

        (1)使用for循环

for (int i = 0; i < list.size(); i++) {int element = list.get(i);System.out.println(element);
}

        (2)使用增强型for循环:

for (int element : list) {System.out.println(element);
}

       

        (3)使用迭代器

Iterator<Integer> iterator = list.iterator();
while (iterator.hasNext()) {int element = iterator.next();System.out.println(element);
}

        以上就是三种遍历Java中ArrayList的方式,每种方式都有其适用的场景,我们需要根据实际需求选择最合适的方式来遍历ArrayList对象。

4.ArrayList常用API

        在上文中,我们大致的了解了什么是Java中的ArrayList,以及学会了创建和遍历Java中的ArrayList,现在让我们学习一下Java中提供给我们的ArrayList中的常用API。

先让我们看一下有哪些常用的ArrayList中的API:

常用方法解释
boolean add(E e)尾插 e
void add(int index, E element)将 e 插入到 index 位置
boolean addAll(Collection<? extends E> c)尾插 c 中的元素
E remove(int index)删除 index 位置元素
boolean remove(Object o)删除遇到的第一个 o
E get(int index)获取下标 index 位置元素
E set(int index, E element)将下标 index 位置元素设置为 element
void clear()清空
boolean contains(Object o)判断 o 是否在线性表中
int indexOf(Object o)返回第一个 o 所在下标
int lastIndexOf(Object o)返回最后一个 o 的下标
List<E> subList(int fromIndex, int toIndex)截取部分 list

这里我们一个一个的进行实例演示:

        (1)boolean add(E e)——尾插 e

import java.util.ArrayList;public class Main {public static void main(String[] args) {// 创建一个空的 ArrayListArrayList<String> list = new ArrayList<>();// 向 ArrayList 中添加元素list.add("Apple");// 打印添加操作的结果System.out.println(list); // 输出:Apple}
}

        在这个示例中,我们创建了一个空的 ArrayList,然后使用 add() 方法向其中添加了一个元素 "Apple",最后打印了list。

       

        (2)void add(int index, E element)——将 e 插入到 index 位置

import java.util.ArrayList;public class Main {public static void main(String[] args) {// 创建一个空的 ArrayListArrayList<String> list = new ArrayList<>();// 向 ArrayList 中指定位置添加元素list.add("Apple");list.add("Banana");list.add("Orange");System.out.println(list); // 输出:[Apple, Banana, Orange]list.add(1, "Grapes"); // 在索引 1 处添加元素 "Grapes"// 打印添加后的 ArrayListSystem.out.println(list); // 输出:[Apple, Grapes, Banana, Orange]}
}

        在这个示例中,我们创建了一个空的 ArrayList,然后使用 add() 方法向其中添加了三个元素:"Apple"、"Banana" 和 "Orange"。接着,我们使用 add(int index, E element) 方法在索引 1 处添加了元素 "Grapes"。最后,我们打印了添加后的 ArrayList,可以看到 "Grapes" 被成功添加到了索引 1 处。

        (3)boolean addAll(Collection<? extends E> c)——尾插 c 中的元素

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;public class Main {public static void main(String[] args) {// 创建一个空的 ArrayListArrayList<String> list1 = new ArrayList<>();list1.add("Apple");list1.add("Banana");// 创建一个包含元素的集合List<String> elementsToAdd = Arrays.asList("Orange", "Grapes");// 使用 addAll() 方法将集合中的元素添加到 ArrayList 中list1.addAll(elementsToAdd);   // 打印最终的 ArrayListSystem.out.println(list1); // 输出:[Apple, Banana, Orange, Grapes]}
}

        在这个示例中,我们创建了一个空的 ArrayList,然后向其中添加了两个元素:"Apple" 和 "Banana"。接着,我们创建了一个包含两个元素的集合 elementsToAdd。最后,我们使用 addAll() 方法将集合 elementsToAdd 中的元素添加到 ArrayList 中。

        (4)E remove(int index)——删除 index 位置元素

import java.util.ArrayList;public class Main {public static void main(String[] args) {// 创建一个包含几个元素的 ArrayListArrayList<String> list = new ArrayList<>();list.add("Apple");list.add("Banana");list.add("Orange");// 打印原始的 ArrayListSystem.out.println("Original ArrayList: " + list); // 输出:[Apple, Banana, Orange]// 移除索引为 1 处的元素String removedElement = list.remove(1);// 打印被移除的元素和最终的 ArrayListSystem.out.println("Removed element: " + removedElement); // 输出:BananaSystem.out.println("Final ArrayList: " + list); // 输出:[Apple, Orange]}
}

        在这个示例中,我们创建了一个包含三个元素的 ArrayList,然后使用 remove(int index) 方法移除了索引为 1 处的元素 "Banana"。最后,我们打印了被移除的元素和最终的 ArrayList,可以看到 "Banana" 被成功移除了。

        (5)boolean remove(Object o)——删除遇到的第一个 o

import java.util.ArrayList;public class Main {public static void main(String[] args) {// 创建一个包含几个元素的 ArrayListArrayList<String> list = new ArrayList<>();list.add("Apple");list.add("Banana");list.add("Orange");// 打印原始的 ArrayListSystem.out.println("Original ArrayList: " + list); // 输出:[Apple, Banana, Orange]// 移除元素 "Banana"list.remove("Banana");// 打印最终的 ArrayListSystem.out.println(list); // 输出:[Apple, Orange]}
}

        在这个示例中,我们创建了一个包含三个元素的 ArrayList,然后使用 remove(Object o) 方法移除了元素 "Banana"。最后,我们打印了最终的 ArrayList,可以看到 "Banana" 被成功移除了。

        (6)E get(int index)——获取下标 index 位置元素

import java.util.ArrayList;public class Main {public static void main(String[] args) {// 创建一个包含几个元素的 ArrayListArrayList<String> list = new ArrayList<>();list.add("Apple");list.add("Banana");list.add("Orange");// 获取索引为 1 处的元素String element = list.get(1);// 打印获取到的元素System.out.println(element); // 输出:Banana}
}

        在这个示例中,我们创建了一个包含三个元素的 ArrayList,然后使用 get(int index) 方法获取了索引为 1 处的元素。最后,我们打印了获取到的元素,可以看到获取操作成功返回了 "Banana" 这个元素。

        (7)E set(int index, E element)——将下标 index 位置元素设置为 element

import java.util.ArrayList;public class Main {public static void main(String[] args) {// 创建一个包含几个元素的 ArrayListArrayList<String> list = new ArrayList<>();list.add("Apple");list.add("Banana");list.add("Orange");// 打印原始的 ArrayListSystem.out.println(list); // 输出:[Apple, Banana, Orange]// 将索引为 1 处的元素替换为 "Grapes"list.set(1, "Grapes");// 打印最终的 ArrayListSystem.out.println(list); // 输出:[Apple, Grapes, Orange]}
}

        在这个示例中,我们创建了一个包含三个元素的 ArrayList,然后使用 set(int index, E element) 方法将索引为 1 处的元素 "Banana" 替换为 "Grapes"。最后,我们打印了最终的 ArrayList,可以看到替换操作成功地将 "Banana" 替换为了 "Grapes"。

        (8)void clear()——清空

import java.util.ArrayList;public class Main {public static void main(String[] args) {// 创建一个包含几个元素的 ArrayListArrayList<String> list = new ArrayList<>();list.add("Apple");list.add("Banana");list.add("Orange");// 打印原始的 ArrayListSystem.out.println(list); // 输出:[Apple, Banana, Orange]// 使用 clear() 方法清空 ArrayListlist.clear();// 打印清空后的 ArrayListSystem.out.println(list); // 输出:[]}
}

        在这个示例中,我们创建了一个包含三个元素的 ArrayList,然后使用 clear() 方法清空了该列表。最后,我们打印了清空后的 ArrayList,可以看到列表中不再包含任何元素。

        (9)boolean contains(Object o)——判断 o 是否在线性表中

import java.util.ArrayList;public class Main {public static void main(String[] args) {// 创建一个包含几个元素的 ArrayListArrayList<String> list = new ArrayList<>();list.add("Apple");list.add("Banana");list.add("Orange");// 检查 ArrayList 是否包含元素 "Banana"boolean containsBanana = list.contains("Banana");// 打印检查结果System.out.println(containsBanana); // 输出:true}
}

        在这个示例中,我们创建了一个包含三个元素的 ArrayList,然后使用 contains(Object o) 方法检查列表中是否包含元素 "Banana"。最后,我们打印了检查结果,可以看到列表中确实包含 "Banana" 元素。

        (10)int indexOf(Object o)——返回第一个 o 所在下标

import java.util.ArrayList;public class Main {public static void main(String[] args) {// 创建一个包含几个元素的 ArrayListArrayList<String> list = new ArrayList<>();list.add("Apple");list.add("Banana");list.add("Orange");// 获取元素 "Banana" 在 ArrayList 中的索引int index = list.indexOf("Banana");// 打印索引值System.out.println(index); // 输出:1}
}

        在这个示例中,我们创建了一个包含三个元素的 ArrayList,然后使用 indexOf(Object o) 方法获取了元素 "Banana" 在列表中的索引。最后,我们打印了索引值,可以看到 "Banana" 元素的索引是 1。

        (11)int lastIndexOf(Object o)——返回最后一个 o 的下标

import java.util.ArrayList;public class Main {public static void main(String[] args) {// 创建一个包含几个元素的 ArrayListArrayList<String> list = new ArrayList<>();list.add("Apple");list.add("Banana");list.add("Orange");list.add("Banana");// 获取元素 "Banana" 在 ArrayList 中的最后一个索引int lastIndex = list.lastIndexOf("Banana");// 打印最后一个索引值System.out.println(lastIndex); // 输出:3}
}

        在这个示例中,我们创建了一个包含四个元素的 ArrayList,其中包含两个 "Banana" 元素。然后使用 lastIndexOf(Object o) 方法获取了元素 "Banana" 在列表中的最后一个索引。最后,我们打印了最后一个索引值,可以看到最后一个 "Banana" 元素的索引是 3。

        (12)List<E> subList(int fromIndex, int toIndex)——截取部分 list

import java.util.ArrayList;
import java.util.List;public class Main {public static void main(String[] args) {// 创建一个包含几个元素的 ArrayListArrayList<String> list = new ArrayList<>();list.add("Apple");list.add("Banana");list.add("Orange");list.add("Grapes");list.add("Kiwi");// 获取子列表,包括索引 1 到 3 的元素,但不包括索引 3List<String> subList = list.subList(1, 3);// 打印子列表System.out.println(subList); // 输出:[Banana, Orange]}
}

        在这个示例中,我们创建了一个包含五个元素的 ArrayList,然后使用 subList(int fromIndex, int toIndex) 方法获取了子列表,包括索引 1 到 3 的元素,但不包括索引 3。最后,我们打印了子列表,可以看到子列表包含了 "Banana" 和 "Orange" 元素。

注意:

        在使用List<E> subList(int fromIndex, int toIndex)方法的时候,我们对获取的子列表进行修改的时候,原来的列表也会被修改。

这样我们就大致的了解了Java中ArrayList的常用API了。


以上就是本篇文章的全部内容了~~~

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

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

相关文章

专题一_双指针_算法专题详细总结

目录 双指针 对撞指针&#xff1a;⼀般⽤于顺序结构中&#xff0c;也称左右指针。 快慢指针&#xff1a;⼜称为⻳兔赛跑算法&#xff0c;其基本思想就是使⽤两个移动速度不同的指针在数组或链表等序列 结构上移动。 1. 移动零&#xff08;easy&#xff09; 「数组分两块」…

中间件解析漏洞

一、iis 1、IIS6.X 1.在iis的⽹站根⽬录新建⼀个名为x.asp的⽂件 2.在x.asp中新建⼀个jpg⽂件。内容为 asp代码 3.在外部浏览器中访问windows2003的iis⽹站中的2.jpg 发现asp代码被执⾏ 4.将2.jpg⽂件放到⽹站根⽬录下访问&#xff0c;发现其中的asp代码没有被解析。 由此可…

1.ASRPRO天问--开发板介绍及第一次使用--开发板挖掘系列

1. 前言 时光不问赶路人&#xff0c;一切尽在不言中&#xff0c;大家好&#xff0c;我是繁花&#xff0c;oh&#xff0c;不对&#xff0c;是繁华的地方不一定留下你的脚印。开学季的到来&#xff0c;也让我这个老人是思绪万千&#xff0c;不要问为啥是老人&#xff0c;因为中人…

linux如何查看内存条是ddr几代

在 Linux 系统中&#xff0c;可以通过以下几种方法查看内存条的类型和代数&#xff08;如 DDR3、DDR4 等&#xff09;&#xff1a; 1. 使用 dmidecode 命令 dmidecode 是一个工具&#xff0c;它可以从系统的 DMI 表&#xff08;也称为 SMBIOS 表&#xff09;中提取硬件信息&a…

【Python】搭配 Python 环境(超详细教程)

要想能够进行 Python 开发&#xff0c;就需要搭建好 Python 的环境。 需要安装的环境主要是两个部分&#xff1a; 运行环境&#xff1a;Python 开发环境&#xff1a;PyCharm 一、安装 Python 1、找到官方网站 Welcome to Python.org 在搜索引擎中搜索 python 关键字&…

9-6对java的认识

java的特性和优势 java的三大版本 JDK,JRE,JVM

sealos快速搭建k8s集群

一&#xff0c;环境准备 1&#xff0c;三台&#xff08;搭建一主两从集群&#xff09;或五台&#xff08;三主两从集群&#xff09;虚拟机&#xff0c; 安装alimaLinux系统 &#xff0c;相同的root密码&#xff0c;不要安装docker。 如果是alimaLinux-mini版本操作系统&#xf…

Web安全:SQL注入实战测试.(扫描 + 测试)

Web安全&#xff1a;SQL注入实战测试. SQL注入就是 有些恶意用户在提交查询请求的过程中 将SQL语句插入到请求内容中&#xff0c;同时程序的本身对用户输入的内容过于相信&#xff0c;没有对用户插入的SQL语句进行任何的过滤&#xff0c;从而直接被SQL语句直接被服务端执行&am…

【Godot4自学手册】第四十六节实现闪电攻击、闪电链

本节内容&#xff0c;主要学习闪电攻击魔法。闪电攻击又名为闪电链&#xff0c;就是在几个敌人之间产生不断跳动的闪电攻击效果。本节主要实现的是单击鼠标右键&#xff0c;会在敌人之间产生随机的闪电链条&#xff0c;效果如下&#xff1a; 一、基本闪电的建立 新建2D场景&…

MIT线性代数

本文链接的原创作者为 浊酒南街https://blog.csdn.net/weixin_43597208 第1讲 MIT_线性代数笔记&#xff1a;第 01 讲 行图像和列图像-CSDN博客 第2讲 MIT_线性代数笔记&#xff1a;第 02 讲 矩阵消元_矩阵first pivot-CSDN博客 第3讲 MIT_线性代数笔记&#xff1a;第 03…

C++ 继承(二)

目录 1. 实现一个不能被继承的类 2. 友元与继承 3.继承与静态成员 4.多继承及其菱形继承问题 (1). 继承模型 (2). 虚继承 (2.1)虚继承解决数据冗余和二义性的原理 (3). 多继承中指针偏移问题 (4). IO库中的菱形虚拟继承 5. 继承和组合 1. 实现一个不能被继承的类 方法1…

安卓玩机工具-----通用安卓玩机工具 “搞机助手”界面预览 推荐

在网络中有很多很好玩的工具。方便安卓机型联机使用各种功能。系列博文将详细的演示有些工具的特点与使用方法 搞机助手 作者&#xff1a;流水断崖 目前开发功能有&#xff1a;Twrp recovery全自动刷机&#xff0c;免Root冻结、卸载预装软件&#xff0c;免Root激活&#xff…

谈一谈MVCC

一 MVCC的定义 MVCC&#xff08;Multi-Version Concurrency Control&#xff0c;多版本并发控制&#xff09;是一种用于数据库管理系统&#xff08;DBMS&#xff09;中的并发控制方法&#xff0c;它允许数据库读写操作不加锁地并发执行&#xff0c;从而提高了数据库系统的并发性…

什么是ARM架构?什么是X86架构?两者的区别是什么?

一、什么是ARM架构 &#xff08;一&#xff09;起源于发展 ARM 架构由英国剑桥的 Acorn 计算机公司开发。因市场无合适产品&#xff0c;Acorn 自行设计出第一款微处理器&#xff0c;命名为 ARM。此后 ARM 架构不断发展&#xff0c;1990 年为与苹果合作成立 ARM 公司&#xff0…

鸿蒙轻内核M核源码分析系列三 数据结构-任务排序链表

往期知识点记录&#xff1a; 鸿蒙&#xff08;HarmonyOS&#xff09;应用层开发&#xff08;北向&#xff09;知识点汇总 在鸿蒙轻内核源码分析系列一和系列二&#xff0c;我们分析了双向循环链表、优先级就绪队列的源码。本文会继续给读者介绍鸿蒙轻内核源码中重要的数据结构…

运动耳机怎么选购?解密最值得购买的五大品牌!

​现在大家都越来越注重健康&#xff0c;运动成了很多人的日常&#xff0c;不管是轻松跑跑步还是来点高强度训练&#xff0c;都能让人身心都受益。运动时候如果能听点音乐&#xff0c;那感觉就更好了&#xff0c;能让运动效果更上一层楼。但是&#xff0c;那种塞进耳朵里的耳机…

Cmake之2.4版本重要特性及用法实例(十)

简介&#xff1a; CSDN博客专家、《Android系统多媒体进阶实战》一书作者 新书发布&#xff1a;《Android系统多媒体进阶实战》&#x1f680; 优质专栏&#xff1a; Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a; 多媒体系统工程师系列【…

S3C2440开发板:时钟,PWM定时器控制蜂鸣器发声

时钟 时钟和电源管理模块由三部分组成&#xff1a;时钟控制&#xff0c;USB 控制和电源控制。 S3C2440A 中的时钟控制逻辑可以产生必须的时钟信号&#xff0c;包括 CPU 的 FCLK&#xff0c;AHB 总线外设的 HCLK 以及 APB 总线外设的 PCLK。S3C2440A 包含两个锁相环&#xff08…

数据结构:(LeetCode203)移除链表元素

给你一个链表的头节点 head 和一个整数 val &#xff0c;请你删除链表中所有满足 Node.val val 的节点&#xff0c;并返回 新的头节点 。 示例 1&#xff1a; 输入&#xff1a;head [1,2,6,3,4,5,6], val 6 输出&#xff1a;[1,2,3,4,5]示例 2&#xff1a; 输入&#xff1…

深度学习之 OpenCV 图像边缘检测算法解析及代码演示

引言 在计算机视觉领域&#xff0c;边缘检测是一种重要的图像预处理技术&#xff0c;用于识别图像中对象的边界。边缘检测有助于提取图像的关键特征&#xff0c;这对于后续的图像分析&#xff08;如物体识别、运动检测等&#xff09;至关重要。OpenCV 是一个强大的计算机视觉库…