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 相关文章推荐
图解排序算法之希尔排序Java实现
Jun 26 Java/Android
Java SSH 秘钥连接mysql数据库的方法
Jun 28 Java/Android
分析JVM源码之Thread.interrupt系统级别线程打断
Jun 29 Java/Android
用Java实现简单计算器功能
Jul 21 Java/Android
SpringBoot整合RabbitMQ的5种模式实战
Aug 02 Java/Android
使用Spring处理x-www-form-urlencoded方式
Nov 02 Java/Android
springboot如何接收application/x-www-form-urlencoded类型的请求
Nov 02 Java/Android
java executor包参数处理功能 
Feb 15 Java/Android
Spring Boot 底层原理基础深度解析
Apr 03 Java/Android
Spring Boot项目传参校验的最佳实践指南
Apr 05 Java/Android
Ubuntu18.04下QT开发Android无法连接设备问题解决实现
Jun 01 Java/Android
Java实现贪吃蛇游戏的示例代码
Sep 23 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
JAVA/JSP学习系列之二
2006/10/09 PHP
php防止网站被刷新的方法汇总
2014/12/01 PHP
PHP中empty,isset,is_null用法和区别
2017/02/19 PHP
Yii2框架配置文件(Application属性)与调试技巧实例分析
2019/05/27 PHP
解决Extjs4中form表单提交后无法进入success函数问题
2013/11/26 Javascript
js键盘上下左右键怎么触发function(实例讲解)
2013/12/14 Javascript
JQuery中extend使用介绍
2014/03/13 Javascript
JavaScript中的数据类型转换方法小结
2015/10/26 Javascript
window.onload绑定多个事件的两种解决方案
2016/05/15 Javascript
使用plupload自定义参数实现多文件上传
2016/07/19 Javascript
避免jQuery名字冲突 noConflict()方法
2016/07/30 Javascript
js自调用匿名函数的三种写法(推荐)
2016/08/19 Javascript
jQuery实现参数自定义的文字跑马灯效果
2018/08/15 jQuery
javascript定时器的简单应用示例【控制方块移动】
2019/06/17 Javascript
JS实现简单日历特效
2020/01/03 Javascript
《javascript设计模式》学习笔记一:Javascript面向对象程序设计对象成员的定义分析
2020/04/07 Javascript
javascript设计模式 ? 策略模式原理与用法实例分析
2020/04/21 Javascript
Python实现3行代码解简单的一元一次方程
2014/08/18 Python
Python的迭代器和生成器
2015/07/29 Python
Python3实现将本地JSON大数据文件写入MySQL数据库的方法
2018/06/13 Python
Python os.access()用法实例
2019/02/18 Python
python实现一个函数版的名片管理系统过程解析
2019/08/27 Python
使用keras2.0 将Merge层改为函数式
2020/05/23 Python
Ubuntu20下的Django安装的方法步骤
2021/01/24 Python
荷兰网上买鞋:MooieSchoenen.nl
2017/09/12 全球购物
Schecker荷兰:狗狗用品和配件
2019/06/06 全球购物
Linux管理员面试题 Linux admin interview questions
2014/11/01 面试题
研发工程师的岗位职责
2013/11/18 职场文书
大学生蛋糕店创业计划书
2014/01/13 职场文书
出生公证委托书
2014/04/03 职场文书
成绩报告单家长评语
2014/12/30 职场文书
家长对学校的意见和建议
2015/06/03 职场文书
政审证明范文
2015/06/19 职场文书
创业计划书之儿童理发店
2019/09/27 职场文书
股东合作协议书模板2篇
2019/11/05 职场文书
祝福语集锦:朋友新店开业祝福语
2019/12/10 职场文书