1,写个递归,遍历出集合的所有子集,可是集合里的元素竟然最后都为空!
附上代码
public static void main(String[] args) {
List<List<Integer>> lists = new ArrayList<>();
int[] a = new int[]{1, 2, 3};
System.out.println(lists);
lists = subsets(lists, a);
System.out.println("========main=========");
for (List list: lists) {
System.out.println(list);
}
}
//
public static List<List<Integer>> subsets(List<List<Integer>> lists, int[] nums) {
List<Integer> list = new ArrayList<>();
for (int num : nums) {
list.add(num);
}
recur(lists, list);
return lists;
}
public static void recur(List<List<Integer>> lists, List<Integer> list) {
if (list.size() == 0) {
return;
}
lists.add(list);
for (int i = 0; i < list.size(); i++) {
//first method-》
//use two code below, list will be covered
list.remove(i);
recur(lists, list);
//second method-》
//use below, will not
// List list2 = new ArrayList();
// for (int num : list) {
// list2.add(num);
// }
// list2.remove(i);
// recur(lists, list2);
}
}
2,自己想找找原因,如果new,那就不会覆盖,如果不new,就会覆盖。网上那么多,都提到了,就是没说什么原因!
3,自己动手,丰衣足食,那么就开始吧。
4,我想打印一下hashcode,可是这种办法不行呀,因为first method的list会被覆盖、second method的list不会被覆盖,两种方法的hashcode找不到原因。
5,突然想起来看过的专栏,介绍到调试时,变量地址!说不定可以值得一试!这个变量地址是什么呢?下图中的红色框标记的
![fbcf090c09da2c33228f3287fea5bd2b.png](https://i-blog.csdnimg.cn/blog_migrate/44407b8a6d1d1e64fca2f8a147e147ea.jpeg)
6,没错,因为lists里存储的多个list的是同一个,也就是都是{ArrayList@524},
那么答案就找到了,你对同一个list多次修改,
而lists里存的都是同一个,remove这个操作,会删掉list里的元素,那么自然lists里的list都会为空!
这就是原因!
7,再写个demo验证一下。
public static void main(String[] args) {
List<List<Integer>> lists = new ArrayList<>();
List list1 = new ArrayList();
for (int i = 0; i < 7; i++) {
list1.add(i);
}
System.out.println(list1);
for (int i = 5; i > 0; i--) {
list1.remove(i);
lists.add(list1);
}
for (List list : lists) {
System.out.println(list);
}
}
![6b7dbbd198acdd75bb1a11a16d65b8a0.png](https://i-blog.csdnimg.cn/blog_migrate/778dca561632043bb0db3a28e4ee74cb.jpeg)
果然,是这样的!