集合的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) 方法往集合里面添加元素只能一个一个添加,不能跳着添加!