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.rhkb.cn/news/290153.html

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

相关文章

UE RPC 外网联机(2)

外网联机配置测试 一、网络配置 开放外网端口开放端口是为了可以进行外网访问;端口包含一个预案管理服务器端口和多个预案服务器端口;(预案管理服务器类似于大厅,预案服务器类似于房间,大厅管理多个房间;) (1)预案管理服务器端口;(如:23001) (2)预案服务器端口…

第十届蓝桥杯大赛个人赛省赛(软件类)真题- CC++ 研究生组-最短路

6 肉眼观察&#xff0c; 看起来短的几条路对比下来是6~ #include <iostream> using namespace std; int main() {printf("6");return 0; }

华为广告打包报错,问题思考

华为广告打包时报错 fata日志不一样能反映出完整的错误日志信息&#xff0c;仅看fata日志具有误导性&#xff0c;有可能指向错误的方向。 通过看完整的日志可见&#xff0c;错误的原因为 Caused by: java.lang.ClassNotFoundException: com.huawei.hms.ads.base.R$dimenfata日…

HarmonyOS 应用开发之ExtensionAbility组件

ExtensionAbility组件是基于特定场景&#xff08;例如服务卡片、输入法等&#xff09;提供的应用组件&#xff0c;以便满足更多的使用场景。 每一个具体场景对应一个 ExtensionAbilityType&#xff0c;开发者只能使用&#xff08;包括实现和访问&#xff09;系统已定义的类型。…

双链表的基本操作

一.双链表的初始化&#xff1a; typedef struct DNode{ //定义双链表结点类型 ElemType data; //数据域 struct DNode*prior, *next; //前驱和后继指针 }DNode&#xff0c;*DLinklist;//初始化双链表 bool InitDLinkList(DLinklist &L){ L ( DNod…

Pytorch的hook函数

hook函数是勾子函数&#xff0c;用于在不改变原始模型结构的情况下&#xff0c;注入一些新的代码用于调试和检验模型&#xff0c;常见的用法有保留非叶子结点的梯度数据&#xff08;Pytorch的非叶子节点的梯度数据在计算完毕之后就会被删除&#xff0c;访问的时候会显示为None&…

第二证券|刚刚,巨象突袭!发生了什么?

又是观看“巨象”表演的一天&#xff01; 今日早盘&#xff0c;A股总市值排前14的股票无一杀跌&#xff0c;三桶油更是集体拉升&#xff0c;我国石油涨超4%&#xff0c;我国海油涨近3%&#xff0c;我国石化涨超2%。排在后面的我国移动、我国电信等股价表现和走势也相当不错。 …

OneNote 中的云端字典在哪里? RoamingCustom.dic 在哪里?

早期懵懂不知&#xff0c;使用 OneNote 时直接将所有标红的单词添加到字典中了。后面才发现默认会添加到云端字典中。因为云端字典是存储在云端上的&#xff0c;所以 onenote 没有给出路径&#xff1a; 难道没办法获取了吗&#xff1f;有的&#xff01; 方案如下&#xff1a;考…

动态多态的注意事项

大家好&#xff1a; 衷心希望各位点赞。 您的问题请留在评论区&#xff0c;我会及时回答。 多态的基本概念 多态是C面向对象三大特性之一&#xff08;多态、继承、封装&#xff09; 多态分为两类&#xff1a; 静态多态&#xff1a;函数重载和运算符重载属于静态多态&#x…

php 快速入门(七)

一、操作数据库 1.1 操作MySQL的步骤 第一步&#xff1a;登录MySQL服务器 第二步&#xff1a;选择当前数据库 第三步&#xff1a;设置请求数据的字符集 第四步&#xff1a;执行SQL语句 1.2 连接MySQL 函数1&#xff1a;mysql_connect() 功能&#xff1a;连接&#xff08;登录…

八大技术趋势案例(人工智能物联网)

科技巨变,未来已来,八大技术趋势引领数字化时代。信息技术的迅猛发展,深刻改变了我们的生活、工作和生产方式。人工智能、物联网、云计算、大数据、虚拟现实、增强现实、区块链、量子计算等新兴技术在各行各业得到广泛应用,为各个领域带来了新的活力和变革。 为了更好地了解…

文件上传失败原因分析与解决

图片文件上传失败 问题描述&#xff1a;在前端开发时&#xff0c;需要通过表单元素上传图片或其他文本&#xff0c;但是上传不成功&#xff0c;后端接口也没问题 html <!--onChange用来绑定数据 handleUpload用来提交数据--><form onSubmit{handleUpload}><…

联想 lenovoTab 拯救者平板 Y700 二代_TB320FC原厂ZUI_15.0.677 firmware 线刷包9008固件ROM root方法

联想 lenovoTab 拯救者平板 Y700 二代_TB320FC原厂ZUI_15.0.677 firmware 线刷包9008固件ROM root方法 ro.vendor.config.lgsi.market_name拯救者平板 Y700 ro.vendor.config.lgsi.en.market_nameLegion Tab Y700 #ro.vendor.config.lgsi.short_market_name联想平板 ZUI T # B…

图论之路径条数专题

一直忙着金工实习蓝桥杯&#xff0c;好久没有看图论了&#xff0c;今天就小试几题享受下被虐的快感。 1.最短路拓扑 首先来几个结论&#xff1a; 1.最短路图没有环&#xff08;可以用反证法证明&#xff09; 2.dis[u]edge[u,v]dis[v]&#xff0c;那么u,v端点的边一定在最短路…

【Redis】redis主从复制

概述 常见的Redis高可用的方案包括持久化、主从复制&#xff08;及读写分离&#xff09;、哨兵和集群。其中持久化侧重解决的是Redis数据的单机备份问题&#xff08;从内存到硬盘的备份&#xff09;&#xff1b;而主从复制则侧重解决数据的多机热备。此外&#xff0c;主从复制…

AI浸入社交领域,泛娱乐APP如何抓住新风口?

2023年是大模型技术蓬勃发展的一年&#xff0c;自ChatGPT以惊艳姿态亮相以来&#xff0c;同年年底多模态大模型技术在国内及全球范围内的全面爆发&#xff0c;即模型能够理解并生成包括文本、图像、视频、音频等多种类型的内容。例如&#xff0c;基于大模型的文本到图像生成工具…

FPGA 图像边缘检测(Canny算子)

1 顶层代码 timescale 1ns / 1ps //边缘检测二阶微分算子&#xff1a;canny算子module image_canny_edge_detect (input clk,input reset, //复位高电平有效input [10:0] img_width,input [ 9:0] img_height,input [ 7:0] low_threshold,input [ 7:0] high_threshold,input va…

2024.3.28学习笔记

今日学习韩顺平java0200_韩顺平Java_对象机制练习_哔哩哔哩_bilibili 今日学习p286-p294 继承 继承可以解决代码复用&#xff0c;让我们的编程更加靠近人类思维&#xff0c;当多个类存在相同的属性和方法时&#xff0c;可以从这些类中抽象出父类&#xff0c;在父类中定义这些…

从人工智能入门到理解ChatGPT的原理与架构的第一天(First)(含机器学习特征工程详解)

目录 一.ChatGPT的发展历程 二.Attention is all you need 三.对于GPT-4的智能水平评估 四.大语言模型的技术演化 1.从符号主义到连接主义 2.特征工程 2.1数据探索 2.2数据清洗 2.3数据预处理 2.3.1无量纲化 2.3.1.1标准化 2.3.1.2区间缩放法 2.3.1.3标准化与归一…

42 ajax 下载文件未配置 responseType blob 导致的文件异常

前言 这是一个最近的关于文件下载碰到的一个问题 主要的情况是, 基于 xhr 发送请求, 获取下载的文件 然后 之后 xhr 这边拿到 字节序列之后, 封装 blob 来进行下载 然后 最开始我们这边没有配置 responseType 为 blob, arraybuffer, 然后 导致下载出来的 文件大小超过了…