Java求幂集与List的浅拷贝深拷贝问题
求幂集
使用回溯法,主要看集合里每一个元素在与不在链表中,在与不在都会创建一个新的解;
import java.util.ArrayList; import java.util.List; public class p78 { public List<List<Integer>> subsets(int[] nums) { List<List<Integer>> result=new ArrayList<List<Integer>>(); backtrack(nums,0,new ArrayList<Integer>(),result); return result; } //回溯 private void backtrack(int []nums,int start,List<Integer> list,List<List<Integer>> result){ //每次进来都将元素链表加入result result.add(new ArrayList<>(list)); for(int i=start;i<nums.length;i++){ //无序性,每个元素往后遍历 list.add(nums[i]); //将当前元素加入链表 backtrack(nums,i+1,list,result); list.remove(list.size()-1); //将最后的元素删除 } } }
List的浅拷贝深拷贝问题
List.add(E e)方法会传入一个对象,实际上存的是该对象的引用,因此即使在add方法执行之后再去改变e的值也会导致存放的e的值改变,所以想要存放不同值的e对象就要在每次add()时传入一个e的深拷贝(通常使用new E(e))实现
public class testListAdd { public static void main(String argv[]){ testListAdd temp=new testListAdd(); temp.test(); } public void test(){ /** * 测试string,因为string是不可变的,因此testString="456";时其实是新的对象,所以list一开始存放的"123"未被改变 */ String List<String> stringList=new ArrayList<>(); String testString="123"; stringList.add(testString); testString="456"; System.out.println(stringList.get(0)); /** * 测试object,因为list存放的是a对象,所以在使用add后再对a操作也会将a的值改变 */ List<student> studentList=new ArrayList<>(); student a=new student(18); studentList.add(a); a.setAge(20); System.out.println(studentList.get(0).getAge()); /** * 与object相似,要想add一个不改变的list,只能add一个它的深拷贝new ArrayList(a) */ List<List<Integer>> listList=new ArrayList<>(); List<Integer> list1=new ArrayList<>(); list1.add(1); listList.add(list1); listList.add(new ArrayList<>(list1)); list1.add(2); for(List l:listList){ for(Object integer:l){ System.out.print(integer+"--"); } System.out.println(); } } class student{ private int age; student(){} student(int age){this.age=age;} public void setAge(int age){ this.age=age; } public int getAge(){ return age; } } }