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实战之用Swing实现通讯录管理系统
Jun 13 Java/Android
分析设计模式之模板方法Java实现
Jun 23 Java/Android
Java常用函数式接口总结
Jun 29 Java/Android
Springboot配置suffix指定mvc视图的后缀方法
Jul 03 Java/Android
详细了解MVC+proxy
Jul 09 Java/Android
mybatis 获取无数据的字段不显示的问题
Jul 15 Java/Android
用Java实现简单计算器功能
Jul 21 Java/Android
Java基础——Map集合
Apr 01 Java/Android
Java 获取Word中所有的插入和删除修订的方法
Apr 06 Java/Android
Spring Data JPA框架的核心概念和Repository接口
Apr 28 Java/Android
springboot读取resources下文件的方式详解
Jun 21 Java/Android
Java服务调用RestTemplate与HttpClient的使用详解
Jun 21 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里得到前天和昨天的日期的代码
2007/08/16 PHP
抓取并下载CSS中所有图片文件的php代码
2011/09/26 PHP
PHP实现简单实用的分页类代码
2016/04/08 PHP
thinkPHP商城公告功能开发问题分析
2016/12/01 PHP
YII框架实现自定义第三方扩展操作示例
2019/04/26 PHP
php抽象方法和普通方法的区别点总结
2019/10/13 PHP
jquery自动完成插件(autocomplete)应用之PHP版
2009/12/15 Javascript
JavaScript 序列化对象实现代码
2009/12/18 Javascript
jquery(hide方法)隐藏指定元素实例
2013/11/11 Javascript
jquery html动态生成select标签出问题的解决方法
2013/11/20 Javascript
在linux中使用包管理器安装node.js
2015/03/13 Javascript
JQuery中clone方法复制节点
2015/05/18 Javascript
老生常谈的跨域处理
2017/01/11 Javascript
JavaScript实现跟随滚动缓冲运动广告框
2017/07/15 Javascript
Vue路由history模式解决404问题的几种方法
2018/09/29 Javascript
jquery UI实现autocomplete在获取焦点时得到显示列表功能示例
2019/06/04 jQuery
vue单页应用的内存泄露定位和修复问题小结
2019/08/02 Javascript
改变layer confirm弹窗按钮的颜色方法
2019/09/12 Javascript
vue实现几秒后跳转新页面代码
2020/09/09 Javascript
vue+canvas实现拼图小游戏
2020/09/18 Javascript
react antd表格中渲染一张或多张图片的实例
2020/10/28 Javascript
解决python写的windows服务不能启动的问题
2014/04/15 Python
python实现在字符串中查找子字符串的方法
2015/07/11 Python
python根据url地址下载小文件的实例
2018/12/18 Python
利用django model save方法对未更改的字段依然进行了保存
2020/03/28 Python
如何将Pycharm中调整字体大小的方式设置为&quot;ctrl+鼠标滚轮上下滑&quot;
2020/11/17 Python
澳大利亚时尚前卫设计师珠宝在线:Amber Sceats
2017/10/04 全球购物
美国机场停车位预订:About Airport Parking
2018/03/26 全球购物
方正Java笔试题
2014/07/03 面试题
民主生活会整改措施(党员)
2014/09/18 职场文书
领导莅临指导欢迎词
2015/09/30 职场文书
《平行四边形的面积》教学反思
2016/02/16 职场文书
五年级作文之学校的四季
2019/12/05 职场文书
你喜欢篮球吗?Python实现篮球游戏
2021/06/11 Python
2022年四月新番
2022/03/15 日漫
浅谈Redis 中的过期删除策略和内存淘汰机制
2022/04/03 Redis