美文网首页
集合--ArrayList--基本方法使用说明

集合--ArrayList--基本方法使用说明

作者: sjandroid | 来源:发表于2018-07-18 18:56 被阅读0次

简要记录下关于ArrayList集合类相关方法的使用说明。

说明:该ArrayList的方法说明是操作jdk1.8来进行梳理的。


  • ensureCapacity(int minCapacity)
    说明:设置ArrayList的容量。
    注意:只有给定的minCapacity大于ArrayList的容量的时候才会执行“扩容操作”。
给定的容量大于List当前容量:
    Test_ensureCapacity(10);
    ..........
    private static void Test_ensureCapacity(int minCapacity) {
        ArrayList<String> list = new ArrayList<>(3);
        list.add("1");
        list.add("1");
        list.add("1");

        System.out.println("ArrayList--容量:" + getElementLength(list));

        list.ensureCapacity(minCapacity);

        System.out.println("ArrayList--容量:" + getElementLength(list));
    }

log:

ArrayList--容量:3
ArrayList--容量:10

给定的容量小于或者等于List当前容量:
Test_ensureCapacity(2);

log

ArrayList--容量:3
ArrayList--容量:3

  • trimToSize()
    说明:设置ArrayList的容量大小为size属性对应的大小(就像方法说明的一样,修剪List的容量至size大小)。
    条件:只有当size小于ArrayList中Object[]的大小时才会设置。
    场景:释放ArrayList未使用的内存。
    private static void Test_trimToSize(){
        ArrayList<String> list = new ArrayList<>();
        list.add("1");

        System.out.println("ArrayList--容量:" + getElementLength(list));

        list.trimToSize();

        System.out.println("ArrayList--容量:" + getElementLength(list));
    }

log

ArrayList--容量:10
ArrayList--容量:1

  • 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;
        }
    }

  • 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三")));
    }

log

true

  • 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("张三")));
    }

log

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()));
    }

log

[张三, 张12三, 张三3, 张三, 张三3]
[0000000, 张12三, 2222222, 张三, 张三3]

  • 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));
    }

  • 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()));
    }

log

[张三, 张三3, 张三, 张三3]

  • 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()));
    }

log

[李四]

  • 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()));
    }

log

[张三, 张三]

  • subList(int fromIndex, int toIndex)
    说明:该方法返回一个SubList(子列表),该SubList是ArrayList中一个私有内部类,并且该SubList直接继承自AbstractList,间接继承于List。
    注意:
    1:调用通过此方法返回的List的实际类型为SubList,其add(),remove()等方法都会对其外部类,也就是ArrayList中的存储的内容进行同步(通过SubList的定义可知,调用SubList的方法其内部还是调用了ArrayList的相应方法对ArrayList存储的内容来进行操作)。
    2:调用此方法后,ArrayList不可再调用“能引起其存储结构发生变化的方法”(具体原因查看 集合--快速失败机制 的介绍)。
    2.1:更改ArrayList中Object[]的容量的方法包括:add(),addAll()remove(),removeAll(),retailAll(),clear(),trimToSize()
    2.2:replaceAll(),sort()
关于SubList的详细介绍,请查看 集合--SubList

正常使用

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

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

        List<Persion> subList = list.subList(2, 4);
        System.out.println("subList:" + Arrays.toString(subList.toArray()));

        System.out.println("删除:" + Arrays.toString(Arrays.asList(p1, p3).toArray()));
        subList.removeAll(Arrays.asList(p1, p3));

        System.out.println("subList:" + Arrays.toString(subList.toArray()));
        System.out.println("ArrayList:" + Arrays.toString(list.toArray()));
    }

log

subList:[李四, 王五]
删除:[张三, 李四]
subList:[王五]
ArrayList:[张三, 张三, 王五, 赵六]

调用subList()后再调用可引起ArrayList“结构发生变化”的方法

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

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

        List<Persion> subList = list.subList(0, 4);
        System.out.println("subList:" + Arrays.toString(subList.toArray()));

        System.out.println("删除:" + Arrays.toString(Arrays.asList(p1, p3).toArray()));
        list.add(0, new Persion("lily"));
        //list.clear();
        //list.trimToSize();
        //list.removeAll(Arrays.asList(p1, p3));
        //list.set(0, new Persion("lily"));

        System.out.println("subList:" + Arrays.toString(subList.toArray()));
        System.out.println("ArrayList:" + Arrays.toString(list.toArray()));
    }

log

Exception in thread "main" java.util.ConcurrentModificationException
    at java.util.ArrayList$SubList.checkForComodification(ArrayList.java:1239)
    at java.util.ArrayList$SubList.size(ArrayList.java:1048)
    at java.util.AbstractCollection.toArray(AbstractCollection.java:136)
    at com.list.array.api.system.arraylist.Test_5.Test_subList(Test_5.java:248)
    at com.list.array.api.system.arraylist.Test_5.main(Test_5.java:56)
subList:[张三, 张三, 李四, 王五]
删除:[张三, 李四]

  • replaceAll(UnaryOperator<E> operator)
    说明:对ArrayList中存储的数据元素进行替换(这会从0开始至size-1处遍历一遍该顺序表,根据UnaryOperator的apply()返回的数据替换掉原位置的数据)。
    注意:此方法是List接口中定义的default方法。
    private static void Test_replaceAll(){
        Persion p1 = new Persion("张三");
        Persion p2 = new Persion("李四");

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

        list.replaceAll(new UnaryOperator<Persion>() {
            @Override
            public Persion apply(Persion persion) {
                return persion.name.equals("李四") ? new Persion("牛魔王") : persion;
            }
        });

        System.out.println("ArrayList:" + Arrays.toString(list.toArray()));
    }

log

ArrayList:[张三, 牛魔王]

  • sort(Comparator<? super E> c)
    说明:对ArrayList中存储的数据元素进行排序。
    注意:需要重写comapre()。
    1:comapre()的返回值有三种:
    0:代表给定的两个变量相等
    负数:代表o1小于o2
    正数:代表o1大于o2

    2:如果ArrayList存储的数据为自定义类型,该类也可以实现Comparable接口,重写compareTo(),然后把Comparator中compare()的比较逻辑放置该自定义类型的compareTo()中。
    private static void Test_sort(){
        Persion p1 = new Persion("张三", 20);
        Persion p2 = new Persion("李四", 32);
        Persion p3 = new Persion("王五", 12);

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

        list.sort(new Comparator<Persion>() {
            @Override
            public int compare(Persion o1, Persion o2) {
                int compareFlag = 0;

                if(o1.age < o2.age){
                    compareFlag = -1;
                } else if(o1.age > o2.age){
                    compareFlag = 1;
                }

                //return o1.compareTo(o2);
                return compareFlag;
            }
        });

        System.out.println("ArrayList:" + Arrays.toString(list.toArray()));
    }

log

ArrayList:[王五_12, 张三_20, 李四_32]

  • iterator()
  • listIterator()
  • spliterator()

相关文章

  • 集合--ArrayList--基本方法使用说明

    简要记录下关于ArrayList集合类相关方法的使用说明。 说明:该ArrayList的方法说明是操作jdk1.8...

  • 2019-06-04

    RedisTemplate常用集合使用说明(一) RedisTemplate常用集合使用说明-opsForValu...

  • Python学习日记-集合

    本章目录 Part One:基本概念 Part Two:常用方法 Part Three:不可变集合 基本概念 集合...

  • 10-廖雪峰-node-web-koa2-nunjucks

    nunjucks render的基本使用方法 怎么引入: 使用说明: 这是最简单使用 nunjucks 的方式,首...

  • ArrayList学习笔记

    ArrayList--动态数组 ArrayList介绍: 从源码分析: 遍历方式:

  • 集合

    目录 集合简介 创建集合 集合常用方法 集合的运算 1. 集合简介 集合(set):一个无序不重复元素的集,基本功...

  • java 对象数组排序

    java对象List集合的排序(基本类型相似); 方法一:使用for循环的方式来进行对象List集合的排序;方法二...

  • 集合

    集合框图: 比较: Collection:最基本的集合接口,长度不固定(常见方法:add、remove、toArr...

  • NumPy基础之数组常用函数(二)

    集合函数 NumPy提供了一些针对一维数组的基本集合运算方法,具体如下表所示。 上表是数组的集合运算方法,其中以u...

  • NO.25 集合操作

    昨天简单介绍了集合Collection和其的一些基本方法,还有一些集合其他的通用方法。 1)addAll、cont...

网友评论

      本文标题:集合--ArrayList--基本方法使用说明

      本文链接:https://www.haomeiwen.com/subject/irowdftx.html