Java数据结构-ArrayList

目录

  • 1. 初识集合框架
  • 2. ArrayList的介绍
  • 3. ArrayList的使用
    • 3.1 构造方法
    • 3.2 add
    • 3.3 addAll
    • 3.4 remove
    • 3.5 get
    • 3.6 set
    • 3.7 contains
    • 3.8 IndexOf
    • 3.9 lastIndexOf
    • 3.10 subList
  • 4. ArrayList的遍历
    • 4.1 简单粗暴法
    • 4.2 循环遍历法
    • 4.3 迭代器

1. 初识集合框架

Java集合框架是Java编程语言提供的一组接口和类,用于存储和操作数据。它提供了各种类型的集合,如列表、集合、映射等,以及用于操作和管理集合的接口和类。

Java集合框架主要包括以下部分:蓝色代表接口,红色代表类,黄色代表抽象类
在这里插入图片描述
前面我们自己实现了一个顺序表:Java数据结构-顺序表,那么我们每次想要使用这个数据结构的时候,都需要自己实现一遍吗?不需要!Java给我们提供了ArrayList这个类,我们使用它就好了!

2. ArrayList的介绍

ArrayList是集合框架中的一个泛型类,可以存储任意的数据,使用可以传递类型,它实现了List接口,ArrayList的本质其实是一个数组。ArrayList使用方法有两种:

	ArrayList<Integer> arr = new ArrayList<>();List<Integer> list = new ArrayList<>();

这两个区别在于:List是一个接口,ArrayList是一个类,因为ArrayList实现了List接口,所以List中有的方法arr都可以调用,并且arr还能调用ArrayList独有的方法。所以ArrayList能调用的方法更多

3. ArrayList的使用

下面列举了一些ArrayList的常用方法

3.1 构造方法

ArrayList的构造方法有3个
第一个:不带参数的构造方法
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
可以看出,调用不带参数的构造方法时,并没有给数组分配内存,数组长度是0

第二个:带一个整型类型参数的构造方法
在这里插入图片描述
initialCapacity表示初始容量,也就是说,我们可以通过参数来指定数组的大小
第三个:
这个参数有点奇怪,它表示:只要是Collection本身或者实现了Collection接口的都能进行传递
在这里插入图片描述
举个例子:
从LinkedList第一张图可以看到,LinkedList是实现了Collection接口的,所以下面代码中list也能作为参数传递给ArrayList,这样可以把list中所有的数据全部添加到arr1中

    public static void main(String[] args) {LinkedList<Integer> list = new LinkedList<>();list.add(100);ArrayList<Integer> arr1 = new ArrayList<>(list);arr1.add(99);System.out.println(arr1);}

3.2 add

add方法的功能:在顺序表的末尾添加数据
add的原理:如果说,实例化ArrayList,调用不带参数的构造方法时,没有分配内存,数组长度是0,那么add是如何添加的?来看源码:
在这里插入图片描述

总结:调用不带参数的构造方法,第一次add时,会给数组分配大小为10的内存,如果容量不够,会自动扩容1.5倍

3.3 addAll

将指定集合的所有元素插入列表,可以指定插入位置,如果不指定默认是尾插
原型:

public boolean addAll(int index, Collection<? extends E> c);
public boolean addAll(Collection<? extends E> c);

举例:arr1中有1 ,2,3 , 4,arr2有99,将arr1整体插入arr2

    public static void main(String[] args) {ArrayList<Integer> arr1 = new ArrayList<>();arr1.add(1);arr1.add(2);arr1.add(3);arr1.add(4);ArrayList<Integer> arr2 = new ArrayList<>();arr2.add(99);System.out.println("arr2在addAll之前:");System.out.println(arr2);arr2.addAll(arr1);System.out.println("addAll之后:");System.out.println(arr2);}

输出结果:
在这里插入图片描述

3.4 remove

删除元素,如果参数为整数,表示删除该下标的值,如果参数为一个对象,表示删除列表中的这个元素
原型:

public E remove(int index);
public boolean remove(Object o);

例:

    public static void main(String[] args) {ArrayList<Integer> arr1 = new ArrayList<>();arr1.add(1);arr1.add(2);arr1.add(3);arr1.add(4);System.out.println("删除前 " + arr1);arr1.remove(0);System.out.println("删除0下标 " + arr1);arr1.remove(Integer.valueOf(3));System.out.println("删除3这个元素 " + arr1);}

输出结果:
在这里插入图片描述

3.5 get

获取index下标位置的元素
原型:

public E get(int index);

3.6 set

将index下标位置设置为element
原型:

public E set(int index, E element);

例:

    public static void main(String[] args) {ArrayList<Integer> arr1 = new ArrayList<>();arr1.add(1);arr1.add(2);arr1.add(3);arr1.add(4);System.out.println("set前" + arr1);arr1.set(0, 99);System.out.println("set后" + arr1);}

输出结果:
在这里插入图片描述

3.7 contains

判断列表中是否包含某个元素,如果包含返回true,否则返回false
例:

    public static void main(String[] args) {ArrayList<Integer> arr1 = new ArrayList<>();arr1.add(1);arr1.add(2);arr1.add(3);arr1.add(4);System.out.println(arr1.contains(1));System.out.println(arr1.contains(99));}

输出结果:
在这里插入图片描述

3.8 IndexOf

获取第一次出现的o的下标,如果不包含o返回-1

public int indexOf(Object o);

例:

    public static void main(String[] args) {ArrayList<Integer> arr1 = new ArrayList<>();arr1.add(1);arr1.add(2);arr1.add(3);arr1.add(4);System.out.println(arr1.indexOf(3));System.out.println(arr1.indexOf(99));}

输出结果:
在这里插入图片描述

3.9 lastIndexOf

原型:

public int lastIndexOf(Object o);

返回最后一次出现的o的下标
例:

    public static void main(String[] args) {ArrayList<Integer> arr1 = new ArrayList<>();arr1.add(1);arr1.add(2);arr1.add(1);arr1.add(4);System.out.println(arr1.lastIndexOf(1));}

输出结果:
在这里插入图片描述

3.10 subList

public List<E> subList(int fromIndex, int toIndex);

截取部分List,从fromIndex下标截取到toIndex(不包括toIndex),截取的结果不是生成新的列表,而是保存fromIndex的位置,所以修改截取部分的内容的同时也会修改原来的列表
例如:

    public static void main(String[] args) {ArrayList<Integer> arr1 = new ArrayList<>();arr1.add(1);arr1.add(2);arr1.add(1);arr1.add(4);List<Integer> list = arr1.subList(1, 3);System.out.println("截取后的list" + list);System.out.println("修改前" + list);list.set(0, 99);System.out.println("修改前" + list);}

输出结果:
在这里插入图片描述

4. ArrayList的遍历

4.1 简单粗暴法

直接使用System.out.println输出,因为重写了toString方法,所以会按一定的格式输出所有元素
例:

    public static void main(String[] args) {ArrayList<Integer> arr = new ArrayList<>();arr.add(1);arr.add(2);arr.add(3);arr.add(4);System.out.println(arr);}

输出结果:
在这里插入图片描述

4.2 循环遍历法

使用for循环遍历或者for each
例:
for循环:

    public static void main(String[] args) {ArrayList<Integer> arr = new ArrayList<>();arr.add(1);arr.add(2);arr.add(3);arr.add(4);for (int i = 0; i < arr.size(); i++) {System.out.print(arr.get(i) + " ");}}

输出结果:
在这里插入图片描述
for each

    public static void main(String[] args) {ArrayList<Integer> arr = new ArrayList<>();arr.add(1);arr.add(2);arr.add(3);arr.add(4);//冒号左边也可以是基本数据类型(会自动拆箱)for (Integer x : arr) {System.out.print(x + " ");}}

输出结果:
在这里插入图片描述

4.3 迭代器

使用Iterator:

    public static void main(String[] args) {ArrayList<Integer> arr = new ArrayList<>();arr.add(1);arr.add(2);arr.add(3);arr.add(4);//迭代器IteratorIterator<Integer> it = arr.iterator();while (it.hasNext()) {System.out.print(it.next() + " ");}}

输出结果:
在这里插入图片描述
使用ListIterator

    public static void main(String[] args) {ArrayList<Integer> arr = new ArrayList<>();arr.add(1);arr.add(2);arr.add(3);arr.add(4);//ListIterator:List专属迭代器 顺序遍历ListIterator<Integer> it = arr.listIterator();while (it.hasNext()) {System.out.print(it.next() + " ");}}

输出结果:
在这里插入图片描述

    public static void main(String[] args) {ArrayList<Integer> arr = new ArrayList<>();arr.add(1);arr.add(2);arr.add(3);arr.add(4);//ListIterator:List专属迭代器)倒序遍历ListIterator<Integer> it = arr.listIterator(arr.size());while (it.hasPrevious()) {System.out.print(it.previous() + " ");}}

输出结果:
在这里插入图片描述
今天的内容就到这里,感谢老铁们的点赞、收藏、评论~❤

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

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

相关文章

图论记录之最短路迪杰斯特拉

简述思想 这个思想能用一句话来概括&#xff0c;精简到的极致:每次找到一个最短距离的点并更新起点到各个点的最短距离 如果要可视化的化&#xff0c;B站搜索Dijksra算法&#xff0c;有视频讲解 代码 这里是Acwing的851题&#xff0c;下面的有注释 import java.util.*;publ…

基于OneAPI+ChatGLM3-6B+FastGPT搭建LLM大语言模型知识库问答系统

搭建大语言模型知识库问答系统 部署OneAPI部署一个LLM模型部署嵌入模型部署FastGPT新建FastGPT对话应用新建 FastGPT 知识库应用 部署OneAPI 拉取镜像 docker pull justsong/one-api创建挂载目录 mkdir -p /usr/local/docker/oneapi启动容器 docker run --name one-api -d …

03 React 基础样式控制

在React中&#xff0c;有多种方式可以管理组件的样式&#xff0c;每种方式都有其优劣势。以下是一些常见的样式管理方法以及它们之间的比较&#xff1a; 内联样式&#xff08;Inline Styles&#xff09;&#xff1a; function MyComponent() {const style {color: red,backg…

粘包/半包及解决方案

一、粘包/半包介绍 1&#xff1a;粘包 粘包&#xff08;Packet Concatenation&#xff09;通常发生在基于流式传输协议&#xff08;如 TCP&#xff09;的通信中&#xff0c;因为 TCP 是面向流的传输协议&#xff0c;它不保证数据包的边界&#xff0c;而是将数据视为连续的字节…

C#面:C# 中的预定义特性有哪些

常见的 C# 预定义特性&#xff1a; [Obsolete]&#xff1a;用于标记已过时的代码或方法。当使用被标记为[Obsolete]的代码时&#xff0c;编译器会发出警告或错误。 [Serializable]&#xff1a;用于标记类&#xff0c;表示该类的对象可以被序列化为字节流&#xff0c;以便在网…

机器学习:处理jira工单的分类问题

如何根据jira工单的category、reporter自动找到处理它的组呢?这是一个利用机器学习中knn算法的小实践. 目录 Knn算法 数据 示例 分割数据 选择Neighbors knn的优缺点 机器学习是一种技术,它的目的是给机器学习能力,让它们可以根据数据自己做决定,所以对于训练…

密码学及其应用1 —— 密码学概述

1 密码学的基本概念 1.1 网络安全的定义 网络安全是网络领域的一个专业领域&#xff0c;它涵盖了在基础计算机网络基础设施中所采取的措施、网络管理员为保护网络及网络可访问资源免受未授权访问而采纳的政策&#xff0c;以及对其有效性&#xff08;或无效性&#xff09;的持续…

2024年2月线上助听器综合电商(京东天猫淘宝)热销排行榜

鲸参谋监测的综合电商平台&#xff08;京东天猫淘宝&#xff09;2月份助听器品牌销量销额排行榜已揭晓&#xff01; 根据鲸参谋电商大数据显示&#xff0c;2月助听器在综合电商平台销量约为19万&#xff0c;环比上个月下滑了2%&#xff0c;同比去年下滑了25%&#xff1b;销售额…

基于nodejs+vue发艺美发店管理系统python-flask-django-php

系统根据现有的管理模块进行开发和扩展&#xff0c;采用面向对象的开发的思想和结构化的开发方法对发艺美发店管理的现状进行系统调查。采用结构化的分析设计&#xff0c;该方法要求结合一定的图表&#xff0c;在模块化的基础上进行系统的开发工作。在设计中采用“自下而上”的…

javaSwing愤怒的小鸟游戏

一、简介 游戏名称是“愤怒的小鸟”&#xff0c;英文称为“AngryBird”。 “愤怒的小鸟”是著名游戏公司Rovio偶然间开发出来的益智游戏&#xff0c;从2009年12月上市到iOS。&#xff0c;讲述了鸟类和猪因为猪偷鸟蛋反生的一系列故事。游戏的类型版本是横向版本的水平视角&…

6、运行时数据区

Java虚拟机在运行Java程序过程中管理的内存区域&#xff0c;称之为运行时数据区。《Java虚拟机规范》中规定了每一部分的作用。 3.1 程序计数器 程序计数器&#xff08;Program Counter Register&#xff09;也叫PC寄存器&#xff0c;每个线程会通过程序计数器记录当前要执行的…

opencv各个模块介绍(1)

Core 模块&#xff1a;核心模块&#xff0c;提供了基本的数据结构和功能。 常用的核心函数&#xff1a; cv::Mat&#xff1a;表示多维数组的数据结构&#xff0c;是OpenCV中最常用的类之一&#xff0c;用于存储图像数据和进行矩阵运算。 cv::Scalar&#xff1a;用于表示多通道…

网络分层协议和应用模型

分层模型 五层网络模型 MAC地址跟IP地址的区别&#xff1a;MAC地址是唯一的&#xff0c;相当于每个人的指纹&#xff0c;出生时就是唯一的&#xff1b;IP地址就相当于是你当前的住址&#xff0c;是会发生变化的&#xff0c;但是是动态唯一的。 应用层协议 URL URL&#xff…

node.js 常用命令71条详解

一、Node.js 常用的命令包括&#xff1a; node 某个js文件&#xff1a;调用 Node.js 程序&#xff0c;运行指定的 JavaScript 文件。例如&#xff0c;如果你有一个名为 app.js 的文件&#xff0c;你可以使用 node app.js 来运行它。npm install&#xff1a;用于安装 Node.js 项…

web渗透测试漏洞流程:红队目标信息收集之资产搜索引擎收集

web渗透测试漏洞流程 渗透测试信息收集---域名信息收集1.域名信息的科普1.1 域名的概念1.2 后缀分类1.3 多重域名的关系1.4 域名收集的作用1.5 DNS解析原理1.6 域名解析记录2. 域名信息的收集的方法2.1 基础方法-搜索引擎语法2.1.1 Google搜索引擎2.1.1.1 Google语法的基本使用…

基于Colab训练的yolov4-tiny自定义数据集(可用于OpenCV For Unity)

参考资料文档和视频。 1.打开文档,点击【文件】【在云端硬盘中保存一份副本】,即将文档复制到自己云端硬盘。 2.打开该文件,按文中提示进行。 【代码执行程序】【更改运行时类型】修改运行时为GPU(免费的GPU不好用,收费的好用,某宝上几十元就可用一个月) 步骤1) !git…

如何调用occtproxy放入自己的wpf文件

1.创建一个wpf程序 2.添加项目occtproxy.vcxproj 3.把该项目配置类型设为dll 4.添加引用 5.报错显示&#xff0c;这是因为还没有生成dll 6.把occtproxy设为启动项目运行&#xff0c;设定输出目录在该目录下&#xff0c;生成dll 7.再运行&#xff0c;即可

一文整合工厂模式、模板模式、策略模式

为什么使用设计模式 今天终于有时间系统的整理一下这几个设计模式了&#xff0c; 这几个真是最常用的&#xff0c;用好了它们&#xff0c;你就在也不用一大堆的if else 了。能更好的处理大量的代码冗余问题。 在我们的实际开发中&#xff0c;肯定会有这样的场景&#xff1a;我…

2024年云仓酒庄新动态:铸就新篇章

原标题&#xff1a;刘总出席成都糖酒会&#xff1a;信任铸就云仓酒庄新篇章&#xff0c;共襄盛举展未来近日&#xff0c;备受瞩目的成都糖酒会盛大开幕&#xff0c;吸引了来自全国各地的业界精英和代表。在这场盛大的行业盛会上&#xff0c;云仓酒庄的刘总亲临现场。 现场&…

以XX大学校园为例的智慧能源管理系统建设方案【能源物联网+智能微电网数字校园、节能校园、低碳校园】

建设背景 贯彻落实《中共中央 国务院关于完整准确全面贯彻新发展理念做好碳达峰碳中和工作的意见》和《国务院关于印发2030年前碳达峰行动方案的通知》要求&#xff0c;把绿色低碳发展纳入国民教育体系。 2021年3月26日为推动信息技术与教育教学深度融合&#xff0c;教育部印…