Java新手教程之ArrayList的基本使用


Posted in Java/Android onJune 20, 2021
目录
  • 1.简介
  • 2. 方法解释
    • (1)contains(Object o)
    • (2)lastIndexOf(Object o)
    • (3) toArray()
    • (4)toArray(T[] a)
    • (5)remove(Object o)
    • (6)removeAll(Collection<?> c)
    • (7)retainAll(Collection<?> c)
    • (8)indexOf(Object o)
  • 总结

 

1.简介

ArrayList 是一个数组队列,相当于 动态数组。与Java中的数组相比,它的容量能动态增长。它继承于AbstractList,实现了List, RandomAccess, Cloneable, java.io.Serializable这些接口。

ArrayList 继承了AbstractList,实现了List。它是一个数组队列,提供了相关的添加、删除、修改、遍历等功能。

ArrayList 实现了RandmoAccess接口,即提供了随机访问功能。RandmoAccess是java中用来被List实现,为List提供快速访问功能的。在ArrayList中,我们即可以通过元素的序号快速获取元素对象;这就是快速随机访问。稍后,我们会比较List的“快速随机访问”和“通过Iterator迭代器访问”的效率。

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

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

和Vector不同,ArrayList中的操作不是线程安全的!所以,建议在单线程中才使用ArrayList,而在多线程中可以选择Vector或者CopyOnWriteArrayList。

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

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

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

方法:

Java新手教程之ArrayList的基本使用

Java新手教程之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;
        }
    }

 

总结

到此这篇关于Java新手教程之ArrayList基本使用的文章就介绍到这了,更多相关Java ArrayList使用内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Java/Android 相关文章推荐
源码解读Spring-Integration执行过程
Jun 11 Java/Android
详解Java实践之建造者模式
Jun 18 Java/Android
Spring boot应用启动后首次访问很慢的解决方案
Jun 23 Java/Android
IDEA使用SpringAssistant插件创建SpringCloud项目
Jun 23 Java/Android
java泛型通配符详解
Jul 25 Java/Android
Log4j.properties配置及其使用
Aug 02 Java/Android
浅谈spring boot使用thymeleaf版本的问题
Aug 04 Java/Android
Java实现房屋出租系统详解
Oct 05 Java/Android
java executor包参数处理功能 
Feb 15 Java/Android
使用HttpSessionListener监听器实战
Mar 17 Java/Android
SpringBoot全局异常处理方案分享
May 25 Java/Android
一文了解Java动态代理的原理及实现
Jul 07 Java/Android
Java各种比较对象的方式的对比总结
Jun 20 #Java/Android
Java Optional<Foo>转换成List<Bar>的实例方法
Jun 20 #Java/Android
详解Java实践之适配器模式
Java数据结构之链表相关知识总结
详解Java实践之抽象工厂模式
Java框架入门之简单介绍SpringBoot框架
详解Java实践之建造者模式
You might like
php获得文件扩展名三法
2006/11/25 PHP
基于PHP的cURL快速入门教程 (小偷采集程序)
2011/06/02 PHP
JS替换字符串中字符即替换全部而不是第一个
2014/06/04 Javascript
Javascript 运动中Offset的bug解决方案
2014/12/24 Javascript
修复bash漏洞的shell脚本分享
2014/12/31 Javascript
JavaScript实现点击自动选择TextArea文本的方法
2015/07/02 Javascript
最新最热最实用的15个jQuery插件汇总
2015/07/05 Javascript
Nodejs Express4.x开发框架随手笔记
2015/11/23 NodeJs
javascript函数命名的三种方式及区别介绍
2016/03/22 Javascript
JavaScript实现倒计时跳转页面功能【实用】
2016/12/13 Javascript
vuejs使用FormData实现ajax上传图片文件
2017/08/08 Javascript
ES6中Array.includes()函数的用法
2017/09/20 Javascript
React+Webpack快速上手指南(小结)
2018/08/15 Javascript
微信小程序实现二维码签到考勤系统
2020/01/16 Javascript
基于vue的video播放器的实现示例
2021/02/19 Vue.js
[01:55]2014DOTA2国际邀请赛 BBC正赛第一天总结
2014/07/10 DOTA
Python学习笔记整理3之输入输出、python eval函数
2015/12/14 Python
python 处理dataframe中的时间字段方法
2018/04/10 Python
Python实现多条件筛选目标数据功能【测试可用】
2018/06/13 Python
详解Python Qt的窗体开发的基本操作
2019/07/14 Python
python re.sub()替换正则的匹配内容方法
2019/07/22 Python
python SocketServer源码深入解读
2019/09/17 Python
matlab灰度图像调整及imadjust函数的用法详解
2020/02/27 Python
Python+OpenCV图像处理——打印图片属性、设置存储路径、调用摄像头
2020/10/22 Python
波兰补充商店:Muscle Power
2018/10/29 全球购物
Madda Fella官网:美国冒险家服装品牌
2020/01/16 全球购物
在使用非全零作为空指针内部表达的机器上, NULL是如何定义
2014/11/09 面试题
2014乡镇干部纪律作风整顿思想汇报
2014/09/13 职场文书
2016年大学自主招生自荐信范文
2015/03/24 职场文书
2015年专项整治工作总结
2015/04/03 职场文书
2015婚礼主持词开场白
2015/05/28 职场文书
导游词之山东八仙过海景区
2019/11/11 职场文书
漫画《尖帽子的魔法工坊》宣布动画化
2022/04/06 日漫
Golang gRPC HTTP协议转换示例
2022/06/16 Golang
python热力图实现的完整实例
2022/06/25 Python
Elasticsearch6.2服务器升配后的bug(避坑指南)
2022/09/23 Servers