集合的clear()方法和add(index, val)方法

  • 关于集合的 clear() 方法 和 add(int index, int val) 方法:
    1、集合的 clear() 方法
    大家先来猜一猜,如下两段代码分别会输出什么:(两者的唯一区别就是第九行和第十七行代码到底是采用 row.clear() 方法,还是采用重新 new 一个ji'he row)
    ①:
    @Test
      public void test(){
          List<List<Integer>> res = new ArrayList<>();
          List<Integer> row = new ArrayList<>();
          row.add(1);
          res.add(row);
          System.out.println(row.toString());
          System.out.println(res.toString());
          row.clear();
          System.out.println(row.toString());
          System.out.println(res.toString());
          row.add(1);
          row.add(1);
          res.add(row);
          System.out.println(row.toString());
          System.out.println(res.toString());
          row.clear();
          System.out.println(row.toString());
          System.out.println(res.toString());
      }
    ②:
    @Test
      public void test(){
          List<List<Integer>> res = new ArrayList<>();
          List<Integer> row = new ArrayList<>();
          row.add(1);
          res.add(row);
          System.out.println(row.toString());
          System.out.println(res.toString());
          row = new ArrayList<>();
          System.out.println(row.toString());
          System.out.println(res.toString());
          row.add(1);
          row.add(1);
          res.add(row);
          System.out.println(row.toString());
          System.out.println(res.toString());
          row = new ArrayList<>();
          System.out.println(row.toString());
          System.out.println(res.toString());
      }

这里先揭示答案:

①:
[]
[[]]
[1, 1]
[[1, 1], [1, 1]]
[]
[[], []]

②:
[1]
[[1]]
[]
[[1]]
[1, 1]
[[1], [1, 1]]
[]
[[1], [1, 1]]

  • 那么,为什么会这个样子呢?这就要说到往集合 A 里面 add 另一个集合 B 时的原理了:
    其实往集合 A 里面 add 另一个集合 B 时,添加的实际上是集合 B 的地址,而并不是这个地址指向的元素,因此,当执行 B.clear() 方法时,只是将 B 的地址指向的元素清空了,而 A 里面存的依然是这个地址。因此接下来在往 B 里 add 新元素时,只是将 B 的地址指向了新的元素,然后将集合 B 再一次 add 进集合 A,add 了两次,相当于此时 A = [B,B], 而两个 B 的地址是一样的,都指向了新添加的元素,因此情况①的16行会输出[[1, 1], [1, 1]]。
    而当采用 row = new ArrayList<>() 时,row 就指向了新的一个地址,因此第二次往集合 A 里面 add 集合 B 时,由于此时的集合 B 跟第一次 add 的集合 B 不是同一个地址,因此并不会改变第一次 add 的集合 B 指向的元素值。

2、集合的 add(int index, int val) 方法:
试想一下以下代码会不会有问题题:

@Test
    public void test(){
        int num = 5;
        List<Integer> res = new ArrayList<>();
        res.add(0,1);
        res.add(4,5);
    }

答案是肯定的,程序的第6行会报异常:java.lang.IndexOutOfBoundsException: Index: 4, Size: 1
而如下这两种方式都是没有问题的:
①:

@Test
    public void test(){
        int num = 5;
        List<Integer> res = new ArrayList<>();
        res.add(0,1);
        res.add(1,2);
        res.add(2,3);
        res.add(3,4);
        res.add(4,5);
        System.out.println(res.toString()); // [1, 2, 3,4,5]
    }

②:

@Test
    public void test(){
        int num = 5;
        List<Integer> res = new ArrayList<>();
        res.add(0,1);
        res.add(1,3);
        res.add(1,2); // 向 index = 1 的位置添加 2,原来 index 为 1 位置上的 元素 3 的 index 会自动变为 2 !
        System.out.println(res.toString()); // [1, 2, 3]
    }

这是因为使用 add(int index, int val) 方法往集合里面添加元素只能一个一个添加,不能跳着添加!

全部评论
楼主很强!
点赞 回复 分享
发布于 2022-09-18 18:11 陕西

相关推荐

jack_miller:我给我们导员说我不在这里转正,可能没三方签了。导员说没事学校催的时候帮我想办法应付一下
点赞 评论 收藏
分享
10-30 22:18
已编辑
毛坦厂中学 C++
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务