Java——ArrayList基本使用

2023-11-08

1.简介

  • ArrayList是实现List接口的,底层采用数组实现。

  • ArrayList 实现了Cloneable接口,即覆盖了函数clone(),能被克隆。

  • ArrayList 实现java.io.Serializable接口,这意味着ArrayList支持序列化,能通过序列化去传输。

方法:
在这里插入图片描述
在这里插入图片描述

2. 方法解释

(1)contains(Object o)

说明:判断该ArrayList中是否包含指定的内容。该方法内部调用indexOf(),如果indexOf()可以查找到该内容返回true,否则返回false。

注意:记得也要重写自定义类型的equals()方法。

    private static void Test_contains(){
        Persion p1 = new Persion("张三");
        Persion p4 = new Persion("张12三");
        Persion p2 = new Persion("张三3");
        Persion p3 = new Persion("张三3");

        ArrayList<Persion> list = new ArrayList<>();
        list.add(p1);
        list.add(p4);
        list.add(p2);

        System.out.println(list.contains(new Persion("张12三")));
    }

(2)lastIndexOf(Object o)

说明:查找给定元素最后一次的位置。也就是说 倒序查找该ArrayList中第一次出现给定元素的位置。存在返回具体的位置,不存在返回-1。

实现:内容采用倒序遍历Object[]方式进行查找。

注意:与indexOf(Object o)方法描述的注意点一样,都需要重写自定义类型的equals()方法。

    private static void Test_laseIndexOf(){
        Persion p1 = new Persion("张三");
        Persion p2 = new Persion("张12三");
        Persion p3 = new Persion("张三3");
        Persion p4 = new Persion("张三");
        Persion p5 = new Persion("张三3");

        ArrayList<Persion> list = new ArrayList<>();
        list.add(p1);
        list.add(p2);
        list.add(p3);
        list.add(p4);
        list.add(p5);

        System.out.println(list.lastIndexOf(new Persion("张三")));
    }

(3) toArray()

说明:以Object[]形式返回ArrayList中存储的数据元素。

实现:返回的Object[]是采用Arrays.copyOf()(实际采用System.arraycopy())方式生成的一个"新数组"。

注意点:返回的Object[]中的数据应该是采用“浅拷贝”方式复制出来的。(也就是说,修改Object[]中元素的内容,ArrayList的内容也会发生改变)

private static void Test_toArray(){
        Persion p1 = new Persion("张三");
        Persion p2 = new Persion("张12三");
        Persion p3 = new Persion("张三3");
        Persion p4 = new Persion("张三");
        Persion p5 = new Persion("张三3");

        ArrayList<Persion> list = new ArrayList<>();
        list.add(p1);
        list.add(p2);
        list.add(p3);
        list.add(p4);
        list.add(p5);

        Object[] array = list.toArray();
        System.out.println(Arrays.toString(array));

        ((Persion)array[0]).name = "0000000";
        ((Persion)array[2]).name = "2222222";

        System.out.println(Arrays.toString(list.toArray()));
    }

(4)toArray(T[] a)

说明:以给定的类型数组形式,返回ArrayList中存储的数据元素。

注意

  • 1:返回的Object[]中的数据应该是采用“浅拷贝”方式复制出来的。(也就是说,修改Object[]中元素的内容,ArrayList的内容也会发生改变)
  • 2:如果给定的数组类型与ArrayList存储的元素类型不匹配的话(给定的类型要是List中存储数据类型的父类型或者其本分),则会抛出"ArrayStoreException"。

原因:System.arraycopy()在做数组拷贝时,如果发现类型不匹配时就会抛出ArrayStoreException。

    private static void Test_toArray2(){
        Persion p1 = new Persion("张三");
        Persion p2 = new Persion("张12三");
        Persion p3 = new Persion("张三3");
        Persion p4 = new Persion("张三");
        Persion p5 = new Persion("张三3");

        ArrayList<Persion> list = new ArrayList<>();
        list.add(p1);
        list.add(p2);
        list.add(p3);
        list.add(p4);
        list.add(p5);

        AbsPersion[] array = list.toArray(new AbsPersion[]{});
        System.out.println(Arrays.toString(array));
    }

(5)remove(Object o)

说明:删除ArrayList中与给定的元素“相等”的且第一次出现的元素。

注意:与indexOf(Object o)方法描述的注意点一样,都需要重写自定义类型的equals()方法。

private static void Test_remove(){
        Persion p1 = new Persion("张三");
        Persion p2 = new Persion("张12三");
        Persion p3 = new Persion("张三3");
        Persion p4 = new Persion("张三");
        Persion p5 = new Persion("张三3");

        ArrayList<Persion> list = new ArrayList<>();
        list.add(p1);
        list.add(p2);
        list.add(p3);
        list.add(p4);
        list.add(p5);

        list.remove(new Persion("张12三"));
        System.out.println(Arrays.toString(list.toArray()));
    }

(6)removeAll(Collection<?> c)

说明:从当前ArrayList中删除指定集合中包含的所有元素。也就是说此方法会从ArrayList中删除其与给定集合的“相交”的数据。

private static void Test_removeAll(){
        Persion p1 = new Persion("张三");
        Persion p2 = new Persion("张三");
        Persion p3 = new Persion("李四");

        ArrayList<Persion> list = new ArrayList<>();
        list.add(p1);
        list.add(p2);
        list.add(p3);

        ArrayList<Persion> list2 = new ArrayList<>();
        list2.add(new Persion("张三"));

        list.removeAll(list2);
        System.out.println(Arrays.toString(list.toArray()));
    }

(7)retainAll(Collection<?> c)

说明:从该列表中删除未包含在指定集合中的所有元素。

也就是说此方法会移除非当前列表和给定列表共有的数据。执行此方法后,该列表只会保留下其与给定列表的“交集”数据。

可以用于求 两个列表的交集。

    private static void Test_retainAll(){
        Persion p1 = new Persion("张三");
        Persion p2 = new Persion("张三");
        Persion p3 = new Persion("李四");
        Persion p4 = new Persion("王五");

        ArrayList<Persion> list = new ArrayList<>();
        list.add(p1);
        list.add(p2);
        list.add(p3);
        list.add(p4);

        ArrayList<Persion> list2 = new ArrayList<>();
        list2.add(new Persion("张三"));

        list.retainAll(list2);
        System.out.println(Arrays.toString(list.toArray()));
    }

(8)indexOf(Object o)

说明:返回ArrayList中第一次出现给定值的数组下标。如果不存在返回-1。

注意

  • 1:如果ArrayList中存储的是自定义类型,需要重写equals()方法,indexOf()内部会调用自定义类的equals()来判断要查找的内容与其中存储的数据元素是否“相等”。
  • 2:如果不重写equals()方法,则只有给定值的内存地址与ArrayList中的数据元素相等时,才能返回其在ArrayList存储的位置,就算内容一致也会返回-1标记ArrayList不存在给定内容。
  • 3:“相等”这个概念不仅表示两个对象的内存地址一样,还代表他们的“内容”相同。
    private static void Test_indexOf(){
        Persion p1 = new Persion("张三");
        Persion p4 = new Persion("张12三");
        Persion p2 = new Persion("张三3");
        Persion p3 = new Persion("张三3");

        ArrayList<Persion> list = new ArrayList<>();
        list.add(p1);
        list.add(p4);
        list.add(p2);

        System.out.println(list.indexOf(new Persion("张12三")));
    }
    .......
    private static class Persion{

        String name;

        public Persion(String name) {
            this.name = name;
        }

        @Override
        public boolean equals(Object obj) {
            //Object的equals()默认实现是:采用“this==obj”来比较 “当前对象与给定对象指向的内存地址是否一致”。
            //如果List中的元素不是String,Integr这些系统提供的类的话(这些系统类都重写了equals()),需要重写equals()方法。
            //为什么要重写??如果不重写,当调用List的提供的系统方法时(例如indexOf()),这些方法可能会调用给定对象的equals()
            //来做相应判断,如果给定的对象的内容相同但是对象在内存的存储地址不同时,则会出现判断错误情况。

            if(obj == null){
                return false;
            }

            if(this == obj){
                return true;
            }

            if(obj instanceof Persion){
                Persion p = (Persion) obj;
                if(p.name == this.name){
                    return true;
                }

                if(p.name == null || this.name == null){
                    return false;
                }

                if(p.name.equals(this.name)){
                    return true;
                }
            }

            return false;
        }
    }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java——ArrayList基本使用 的相关文章

  • 常见的函数式接口介绍

    Supplier
  • Java中用flush()方法的作用

    flush 方法将输入流和输出流中的缓冲进行刷新 使缓冲区中的元素即时做输入和输出 而不必等缓冲区满
  • Intellij IDEA 的快捷键收集

    文档链接 IntelliJ IDEA13基础教程
  • Java笔记-Object,String,Math,BigInteger类

    一 项目的jar包的导入与导出 jar包是一个可以包含许多 class文件的压缩文件 我们可以将一个jar包加入到项目的依赖中 从而该项目可以使用该jar下的所有类 也可以把项目中所有的类打包到指定的jar包 提供给其他项目使用 1 1导出
  • MySql数据库修改表字段date类型为datetime类型

    语法 ALTER TABLE 表 MODIFY COLUMN 字段 字段类型 DEFAULT 默认值 COMMENT 说明 例如 alter table t user modify column createTime datetime de
  • 实现 后台需要显示订单信息,但是订单信息里面涉及到查询2张表 。本代码使用了MapListHandler

    Dao层的代码实现 Service层实现 Servlet层实现 Bean 实现效果 以上是图片展示 一下是部分代码展示 DAO部分 通过查出2个表的数据where u id o id的数据MapListHandler 然后再通过遍历MapL
  • 好用用的linux 监控命令

    1 dstat 命令 参考http www cnblogs com vincent hv p 3358194 html dstat的基本使用 2 1 dstat的默认选项 与许多命令一样 dstat命令有默认选项 执行dstat命令不加任何
  • (短信服务)java SpringBoot 阿里云短信功能实现发送手机验证码

    一 阿里云准备工作 1 阿里云短信服务 注册账号 阿里云官网 https www aliyun com 点击官网首页注册按钮 2 阿里云短信服务 设置短信签名 阿里云提供测试的签名 暂时可以跳过 注册成功后 点击登录按钮进行登录 登录后进入
  • JAVA异常详解

    异常的定义 异常就是有异于常态 和正常情况不一样 有错误出现 在java中 阻止当前方法或作用域的情况 称之为异常 异常的分类 Error 是程序中无法处理的错误 表示运行应用程序中出现了严重的错误 此类错误一般表示代码运行时JVM出现问题
  • Java 线程的生命周期(对应七大状态)

    博主前些天发现了一个巨牛的人工智能学习网站 通俗易懂 风趣幽默 忍不住也分享一下给大家 点击跳转到网站 线程的生命周期 线程状态的转换 通过代码输出线程的状态 代码如下 public class ThreadState public sta
  • Java 中SimpleDateFormat类的使用

    博主前些天发现了一个巨牛的人工智能学习网站 通俗易懂 风趣幽默 忍不住也分享一下给大家 点击跳转到网站 SimpleDateFormat类的介绍 SimpleDateFormat类是一个具体的类 用于以区域设置敏感的方式格式化和解析日期 日
  • Java学习笔记 -- 包 (package)

    Java 面向对象篇 笔记首页 序号 内容 链接地址 1 面向对象概述 https blog csdn net weixin 44141495 article details 107999131 2 类与对象 https blog csdn
  • Android 开发中ScrollView无法上下滚动

    本节目录 问题 解决办法 问题 因项目需要做一个App出来 所以最近在学Android Studio开发 但是我在利用ScrollView实现内容上下滚动的时候出现了一个问题 就是无法将超出页面的内容进行上下滑动 设计UI界面如下 这里的T
  • java数据类型转换,基本数据类型和String数据类型之间的转换

    6月16日学习打卡 自动类型转换 强制转换 基本数据类型和String转换 3 8类型转换 3 8 1自动类型转换 1 低精度向高精度赋值可以自动转换类型 char gt int gt long gt float gt double byt
  • 问题 2020-6-10

    MySQL查考数据表中某一列是否有重复数据 解决 MySQL中 查询表 dat bill 2018 11 中字段 product id 值重复的记录 SELECT product id COUNT AS sumCount FROM dat
  • Java 网络编程UDP协议之发送数据和接收数据的详解

    博主前些天发现了一个巨牛的人工智能学习网站 通俗易懂 风趣幽默 忍不住也分享一下给大家 点击跳转到网站 UDP协议 用户数据报协议 User Datagram Protocol UDP是无连接通信协议 即在数据传输时 数据的发送端和接收端不
  • Java的8种基本数据类型

    博主前些天发现了一个巨牛的人工智能学习网站 通俗易懂 风趣幽默 忍不住也分享一下给大家 点击跳转到网站 前言 Java数据类型分为两大类 基本数据类型 引用类型 如图所示 下面讲解的是Java的八种基本数据类型 一 按照数据类型来分 1 整
  • 调试代码

    1 用浏览器打开需要调试的页面 2 打开调试模式 在谷歌浏览器中 点击F12 可以打开开发者模式 刷新页面就可以看到数据的传输 也可以通过鼠标右键 选择 重新加载框架 可以查到某个部分的刷新 找到调用的接口 通过该接口去原程序中找到对应的方
  • SocketOutputStream和SocketChannel write方法的区别和底层实现

    Java直接内存原理提到了SocketChannel write的实现原理 通过IOUtil write将java堆内存拷贝到了直接内存 然后再把地址传给了I O函数 那么 BIO 是怎么实现往socket里面写数据的呢 BIO Socke
  • .gitignore是干什么的?

    Git忽略文件 gitignore详解 在工程中 并不是所有文件都需要保存到版本库中的 例如 target 目录及目录下的文件就可以忽略 在Git工作区的根目录下创建一个特殊的 gitignore文件 然后把要忽略的文件名填进去 Git就会

随机推荐

  • 基于Qt的收银点餐系统之UI的基本实现(二)

    在上一篇文章中 主要是从宏观上去探讨Qt中UI的实现方案 这一篇文章 将给出具体的代码 实现结果 一 实现思路 上一篇文章讲到 布局工作的特点为 区域划分 层层嵌套 同时整个布局工作中 关键点也在于如何划分区域 如何找到层层嵌套的关系 在这
  • SpringSecurity快速入门和自定义用户名、密码的实现

    SpringSecurity自定义用户名和密码的实现 在SpringBoot项目中导入SpringSecurity依赖 自定义用户名和密码登录的实现 第一种实现方式 配置文件的实现 第二种实现方式 继承WebSecurityConfigur
  • php中_initialize的返回

    php中子类会自动调用父类的 initialize 方法 而不用像 construct 构造方法中 要在子类的构造方法中写明调用父类的构造方法 parent construct 可以将权限验证 生成菜单等每个方法都要使用的操作 放在父类的
  • 企业数字化转型中的能力框架

    首先还是看下对于数字化转型的一个基本定义 我们在这里引用两个定义 一个是百度百科的定义 一个是IDC的定义 先看下百度百科上对数字化转型定义如下 数字化转型 Digital transformation 是建立在数字化转换 Digitiza
  • 【python二级-练习题】

    python江湖 1 求长方形面积 题目描述 代码如下 2 随机密码验证 题目描述 代码如下 3 信息分配表 字典 题目描述 代码如下 4 全模式分词 jieba 题目描述 代码如下 5 数字金字塔 题目描述 代码如下 6 求最大值 最小值
  • GB28181媒体保活机制探究与实现

    规范解读 GB28181 2016和GB28181 2022关于媒体保活机制这块 并无调整 平台 设备媒体流保活机制规定如下 a 链路建立后 码流经过的各级平台应具备媒体流丢失监测能力 若监测到媒体流丢失 应释放该条媒体链路 并通过会话内B
  • tar打包的时候忽略一些目录

    我的个人博客 逐步前行STEP tar打包的时候忽略版本管理文件目录 日志文件目录 storage app目录 tar zcvf web tar gz web exclude vcs exclude storage logs exclude
  • SQL service 数据库 某工厂的物料管理系统数据库设计与实现

    实现物料的分类管理 实现部门和员工信息管理 实现物料的入库和领用管理 实现物料的转仓管理 创建触发器 实现物料入库和领用时相应物料库存的自动更新 创建触发器 实现转仓时转入仓库物料增加 转出仓库物料减少 创建存储过程统计各仓库各种物料的现存
  • docker启动报错:Job for docker. service failed because the control process exited with error code

    1 在使用systemctl start docker时 一直报错 如下图 试了网上的方法 a 修改docker service文件 b 在daemon json中增加代码 都不能解决我遇到的情况 2 经过不懈努力 终于找到办法 在 etc
  • 存量时代下,期货公司如何借助内容实现运营突破

    QuestMobile在 中国移动互联网发展启示录 中披露了一组数据 截止到2021年9月 中国的网民总人数达到11 67亿人 同比仅增加1400万 以上数据表明 流量红利消失殆尽已成为既定的事实 对期货公司来说 流量红利的消失也让其陷入用
  • 电源系列2:LDO 基本 原理(二)

    公众号 工程师看海 后台回复 LDO仿真文件 远山看海 LDO基本原理介绍 一 zhuanlan zhihu com NMOS LDO工作简介 下图是一个NMOS LDO的基本框图 NMOS LDO一般也工作在饱和区 特殊时会在可变电阻区
  • gensim读取已训练模型LDA模型的模型与dictionary

    import pyLDAvis gensim from gensim import models corpora from gensim corpora import Dictionary all data 青绿色 放 几天 塑料袋 里 刺
  • 世界经济论坛区块链报告阅读笔记

    文章目录 世界经济论坛区块链报告阅读笔记 DLT应用落地需要什么 报告案例 Global Payments 报告案例 P C Claims Processing 世界经济论坛区块链报告阅读笔记 该报告主要谈及DLT distributed
  • Android onKeyDown监听返回键无效的解决办法

    文章转载自 https www jb51 net article 115941 htm Android onKeyDown监听返回键无效的解决办法 当我们的Activity继承了TabActivity 在该类中重写onKeyDown是监听不
  • node切换版本

    1 首先卸载node 删除node文件夹 在C Program Files路径下查找 2 安装nvm 下载nvm setup zip文件 进行安装 nvm网址 Releases coreybutler nvm windows GitHub
  • 数据表中常见的数据类型

    数据表中常见的数据类型有 整数类型 浮点数类型 日期与时间类型 字符串类型 二进制类型 布尔类型 整数类型 1int型 表示整型数值 是由四个字节组成的整数 输出范围 2147 2147 数据类型32位 short型 表示短整型 输出范围是
  • 项目_MySQL服务器被入侵,数据丢失,一招教你恢复数据【已恢复】

    已恢复 MySQL服务器被入侵 数据丢失 一招教你恢复数据 0 前言 当时在宝塔安装了MySQL5 7 然后当时只是测试 就直接设置用户名和密码为root 今天在Navicat突然登录不上了 于是在linux下登录MySQL 只剩下一个Re
  • Python进阶-----面向对象1.0(对象和类的介绍、定义)

    目录 前言 面向过程和面向对象 类和对象 Python中类的定义 1 类的定义形式 2 深层剖析类对象 前言 感谢各位的一路陪伴 我学习Python也有一个月了 在这一个月里我收获满满 学到了很多知识 每当我学会了一个新的知识点我会发表一篇
  • 压控恒流源学习笔记

    激光二极管 以下称LD 即使采用恒流驱动 其光输出功率也会随温度变化而发生大的变动 因此必须监视它的光输出 利用反馈环路来控制驱动电流 这即是自动输出控制APC AutomatICPowerControl 电路 第一种 调节激光亮度 可以依
  • Java——ArrayList基本使用

    1 简介 ArrayList是实现List接口的 底层采用数组实现 ArrayList 实现了Cloneable接口 即覆盖了函数clone 能被克隆 ArrayList 实现java io Serializable接口 这意味着Array