文章目录

  • 一、ArrayList介绍
  • 二、ArrayList特有方法 `ArrayList应知应会`
  • 2.1 调用addAll() 方法将一个Collection集合添加到ArrayList中
  • 2.2 调用 removeAll()方法删除存在于指定Collection集合中的ArrayList里的所有数据元素
  • 2.3 调用subList()方法截取部分ArrayList的元素
  • 三、ArrayList可重复特点
  • 四、ArrayList存取顺序一致
  • 五、ArrayList有带索引的方法
  • 5.1 普通输出语句输出ArrayList集合
  • 5.2 普通for循环输出ArrayList集合
  • 5.3 forEach语句输出ArrayList集合
  • 5.4 Iterator迭代器输出ArrayList集合
  • 六、ArrayList删除指定值的数据
  • 6.1 删除指定值的数据(漏删数据问题) `常见问题`
  • 6.2 漏删数据解决办法


一、ArrayList介绍

ArrayList是List接口的一个实现类(ArrayList实现了List的接口),它具有List的特点。ArrayList的底层结构是数组。

java arraylist 里面不能包含重复的 arraylist可重复吗_java

ArrayList并没有其他特点,List的特点即为它的特点:
可重复:当存入相同数据时,可以有重复的数据存入,这是因为List集合有带索引的方法,可以通过索引值不同来辨别那些相同的数据。存取顺序一致:存入数据的顺序与输出数据的顺序一定一致。有带索引的方法:可以直接通过索引得到相应数据,可以直接使用普通for循环来遍历集合。

接下来我们将结合代码来具体学习ArrayList相关知识。

二、ArrayList特有方法 ArrayList应知应会

由于ArrayList是List接口和Collection接口的实现类,因此List和Collection所拥有的方法,ArrayList均可使用,在此不再详细讲述。

方法名

说明

boolean addAll(Collection c)

将一个Collection集合添加到ArrayList中

boolean removeAll(Collection c)

删除存在于指定Collection集合中的ArrayList里的所有数据元素

List subList(int fromIndex,int toIndex)

截取部分ArrayList的元素

2.1 调用addAll() 方法将一个Collection集合添加到ArrayList中

我们来一起回顾一下,Collection所包含的接口与常见实现类

java arraylist 里面不能包含重复的 arraylist可重复吗_java_02


调用addAll() 方法将一个ArrayList集合添加到ArrayList中

public static void main(String[] args) {
        //创建一个数据类型为String的ArrayList对象
        ArrayList<String> arrayList=new ArrayList<>();

        //再次创建一个数据类型为String的ArrayList对象
        ArrayList<String> arrayList1=new ArrayList<>();
        //调用add()方法增添数据
        arrayList1.add("a");arrayList1.add("b");arrayList1.add("c");

        //调用addAll()方法将一个ArrayList集合添加到ArrayList中
        arrayList.addAll(arrayList1);

        //普通输出
        System.out.println(arrayList);
    }

运行结果:

java arraylist 里面不能包含重复的 arraylist可重复吗_数据类型_03


调用addAll() 方法将一个LinkedList集合添加到ArrayList中

public static void main(String[] args) {
        //创建一个数据类型为String的ArrayList对象
        ArrayList<String> arrayList=new ArrayList<>();

        //创建一个数据类型为String的LinkedList对象
        LinkedList<String> list=new LinkedList<>();
        //调用add()方法增添数据
        list.add("aa");list.add("bb");list.add("cc");

        //调用addAll()方法将一个LinkedList集合添加到ArrayList中
        arrayList.addAll(list);

        //普通输出
        System.out.println(arrayList);
    }

运行结果:

java arraylist 里面不能包含重复的 arraylist可重复吗_数据类型_04


调用addAll() 方法将一个HashSet集合添加到ArrayList中

public static void main(String[] args) {
        //创建一个数据类型为String的ArrayList对象
        ArrayList<String> arrayList=new ArrayList<>();

        //创建一个数据类型为String的HashSet对象
        HashSet<String> hashSet=new HashSet<>();
        //调用add()方法增添数据
        hashSet.add("aaa");hashSet.add("bbb");hashSet.add("ccc");hashSet.add("ccc");

        //调用addAll() 方法将一个HashSet集合添加到ArrayList中
        arrayList.addAll(hashSet);

        //普通输出
        System.out.println(arrayList);
    }

运行结果:(我们看到当我们存入集合是Set集合时,存取顺序会变得不一致,并且不会有重复数据

java arraylist 里面不能包含重复的 arraylist可重复吗_数据_05


调用addAll() 方法将一个TreeSet集合添加到ArrayList中

public static void main(String[] args) {
        //创建一个数据类型为String的ArrayList对象
        ArrayList<String> arrayList=new ArrayList<>();

        //创建一个数据类型为String的TreeSet对象
        TreeSet<String> treeSet=new TreeSet<>();
        //调用add()方法增添数据
        treeSet.add("aaaa");treeSet.add("cccc");treeSet.add("bbbb");treeSet.add("cccc");

        //调用addAll() 方法将一个TreeSet集合添加到ArrayList中
        arrayList.addAll(treeSet);

        //普通输出
        System.out.println(arrayList);
    }

运行结果:(我们看到当我们存入集合是Set集合时,存取顺序会变得不一致,并且不会有重复数据

java arraylist 里面不能包含重复的 arraylist可重复吗_java_06


2.2 调用 removeAll()方法删除存在于指定Collection集合中的ArrayList里的所有数据元素

接下来我们就不再像addAll()一样一个个罗列,因为这些操作都是一样的。

调用removeAll() 方法将一个TreeSet集合从ArrayList中删除

public static void main(String[] args) {
        //创建一个数据类型为String的ArrayList对象
        ArrayList<String> arrayList=new ArrayList<>();
        //调用add()方法增添数据
        arrayList.add("a");arrayList.add("b");arrayList.add("c");

        //创建一个数据类型为String的TreeSet对象
        TreeSet<String> treeSet=new TreeSet<>();
        //调用add()方法增添数据
        treeSet.add("aaaa");treeSet.add("cccc");treeSet.add("bbbb");treeSet.add("cccc");

        //调用addAll()方法将一个TreeSet集合添加到ArrayList中
        arrayList.addAll(treeSet);

        //调用removeAll() 方法将一个TreeSet集合从ArrayList中删除
        arrayList.removeAll(treeSet);

        //普通输出
        System.out.println(arrayList);
    }

运行结果:

java arraylist 里面不能包含重复的 arraylist可重复吗_java_07


2.3 调用subList()方法截取部分ArrayList的元素

public static void main(String[] args) {
        //创建一个数据类型为String的ArrayList对象
        ArrayList<String> arrayList=new ArrayList<>();
        //调用add()方法增添数据
        arrayList.add("a");arrayList.add("b");arrayList.add("c");

        //创建一个数据类型为String的TreeSet对象
        TreeSet<String> treeSet=new TreeSet<>();
        //调用add()方法增添数据
        treeSet.add("aaaa");treeSet.add("cccc");treeSet.add("bbbb");treeSet.add("cccc");

        //调用addAll()方法将一个TreeSet集合添加到ArrayList中
        arrayList.addAll(treeSet);

        //调用subList()方法截取部分ArrayList的元素
        List<String> strings = arrayList.subList(2, 4);
        //普通输出截取元素
        System.out.println(strings);
    }

运行结果:

java arraylist 里面不能包含重复的 arraylist可重复吗_java_08


三、ArrayList可重复特点

我们增添两个c和两个c数据

public static void main(String[] args) {
        //创建一个数据类型为String的ArrayList对象
        ArrayList<String> arrayList=new ArrayList<>();
        //调用add()方法增添数据
        arrayList.add("a");
        arrayList.add("b");
        arrayList.add("c");
        arrayList.add("c");
        //普通输出
        System.out.println(arrayList);
    }

运行结果:(我们看到重复的数据同样也会被输出

java arraylist 里面不能包含重复的 arraylist可重复吗_java_09


四、ArrayList存取顺序一致

我们存入数据的顺序是aoao,daidai,bobo,lisi,wangwu,zhangsan

public static void main(String[] args) {
        //创建一个数据类型为String的ArrayList对象
        ArrayList<String> arrayList=new ArrayList<>();
        //调用add()方法增添数据
        arrayList.add("aoao");
        arrayList.add("daidai");
        arrayList.add("bobo");
        arrayList.add("lisi");
        arrayList.add("wangwu");
        arrayList.add("zhangsan");
        //普通输出
        System.out.println(arrayList);
    }

运行结果:

java arraylist 里面不能包含重复的 arraylist可重复吗_数据_10


五、ArrayList有带索引的方法

因为ArrayList有带索引的方法,因此可以直接通过索引得到相应数据,可以使用普通for循环,普通输出语句,forEach语句和Iterator迭代器来遍历集合。

5.1 普通输出语句输出ArrayList集合

public static void main(String[] args) {
        //创建一个数据类型为String的ArrayList对象
        ArrayList<String> arrayList=new ArrayList<>();
        //调用add()方法增添数据
        arrayList.add("aoao");
        arrayList.add("daidai");
        arrayList.add("bobo");
        arrayList.add("lisi");
        arrayList.add("wangwu");
        arrayList.add("zhangsan");
        //普通输出
        System.out.println(arrayList);
    }

运行结果:

java arraylist 里面不能包含重复的 arraylist可重复吗_数据_10


5.2 普通for循环输出ArrayList集合

public static void main(String[] args) {
        //创建一个数据类型为String的ArrayList对象
        ArrayList<String> arrayList=new ArrayList<>();
        //调用add()方法增添数据
        arrayList.add("aoao");
        arrayList.add("daidai");
        arrayList.add("bobo");
        arrayList.add("lisi");
        arrayList.add("wangwu");
        arrayList.add("zhangsan");
        //普通for循环输出ArrayList集合
        for (int i = 0; i < arrayList.size(); i++) {
            System.out.println(arrayList.get(i));
        }
    }

运行结果:

java arraylist 里面不能包含重复的 arraylist可重复吗_java_12


5.3 forEach语句输出ArrayList集合

public static void main(String[] args) {
        //创建一个数据类型为String的ArrayList对象
        ArrayList<String> arrayList=new ArrayList<>();
        //调用add()方法增添数据
        arrayList.add("aoao");
        arrayList.add("daidai");
        arrayList.add("bobo");
        arrayList.add("lisi");
        arrayList.add("wangwu");
        arrayList.add("zhangsan");
        //forEach语句输出ArrayList集合
        //s即为list遍历的结果,String即为Arraylist的数据类型
        for (String s : arrayList) {
            System.out.println(s);
        }
    }

运行结果:

java arraylist 里面不能包含重复的 arraylist可重复吗_算法_13


5.4 Iterator迭代器输出ArrayList集合

public static void main(String[] args) {
        //创建一个数据类型为String的ArrayList对象
        ArrayList<String> arrayList=new ArrayList<>();
        //调用add()方法增添数据
        arrayList.add("aoao");
        arrayList.add("daidai");
        arrayList.add("bobo");
        arrayList.add("lisi");
        arrayList.add("wangwu");
        arrayList.add("zhangsan");
        //Iterator迭代器输出ArrayList集合
        Iterator<String> iterator=arrayList.iterator();
        //iterator.hasNext()的作用即为判断当前位置是否存在元素,若存在则返回true,否则返回false
        while(iterator.hasNext()){
            //iterator.next()的作用即为获取当前位置元素,并指向下一位置以便hashNext判断
            System.out.println(iterator.next());
        }
    }

运行结果:

java arraylist 里面不能包含重复的 arraylist可重复吗_开发语言_14


六、ArrayList删除指定值的数据

6.1 删除指定值的数据(漏删数据问题) 常见问题

public static void main(String[] args) {
        //创建一个数据类型为String的ArrayList对象
        ArrayList<String> arrayList=new ArrayList<>();
        //调用add()方法增添数据
        arrayList.add("daidai");
        arrayList.add("daidai");
        arrayList.add("aoao");
        arrayList.add("bobo");
        arrayList.add("lisi");
        arrayList.add("wangwu");
        arrayList.add("zhangsan");
        arrayList.add("daidai");
        //ArrayList删除值为daidai的元素
        for (int i = 0; i < arrayList.size(); i++) {
            if(arrayList.get(i).equals("daidai")){
                arrayList.remove(i);
            }
        }
        //普通输出
        System.out.println(arrayList);
    }

运行结果:(我们发现仍然有一个daidai未被删除

java arraylist 里面不能包含重复的 arraylist可重复吗_数据类型_15

原因:当我们删除某一元素后,之前此元素之后的所有数据会左移,那么如果第二个与此元素相等的元素,于此元素并排,它就会左移至此元素的位置,而我们的指针之后会加1,因此会跳过它。文字难以理解?没关系,上图解!!!

首先我们插入数据集合元素的顺序如下:

java arraylist 里面不能包含重复的 arraylist可重复吗_数据_16


当我们删除第一个daidai之后,集合变为如下图:(我们不难得出结论当我们删除ArrayList集合中的某一数据时,集合会自动缩容。被删除的元素之后的元素会发生左移,即我们删除daidai之后之前索引为1值为daidai的元素左移后,变为索引为0值为daidai

java arraylist 里面不能包含重复的 arraylist可重复吗_数据_17


但是此时我们的i索引指向的是1,因此在之后的遍历中会跳过一个daidai,发生漏删现象

java arraylist 里面不能包含重复的 arraylist可重复吗_数据类型_18


6.2 漏删数据解决办法

当我们删除一个数据后,为了防止漏删,索引i也应跟着左移,即i-1

public static void main(String[] args) {
        //创建一个数据类型为String的ArrayList对象
        ArrayList<String> arrayList=new ArrayList<>();
        //调用add()方法增添数据
        arrayList.add("daidai");
        arrayList.add("daidai");
        arrayList.add("aoao");
        arrayList.add("bobo");
        arrayList.add("lisi");
        arrayList.add("wangwu");
        arrayList.add("zhangsan");
        arrayList.add("daidai");
        //ArrayList删除值为daidai的元素
        for (int i = 0; i < arrayList.size(); i++) {
            if(arrayList.get(i).equals("daidai")){
                arrayList.remove(i);
                //之所以i要减一,是因为当我们删除第一个daidai后,之前第一个daidai之后的所有数据会左移,那么第二个daidai就会左移至第一个daidai的位置,如果我们的i不减1,那么就会跳过第二个daidai而不删除它
                i=i-1;
            }
        }
        //普通输出
        System.out.println(arrayList);
    }

运行结果:

java arraylist 里面不能包含重复的 arraylist可重复吗_算法_19


OK!!!ArrayList介绍结束!!!