java求幂_Java求幂集与List的浅拷贝深拷贝问题

求幂集

使用回溯法,主要看集合里每一个元素在与不在链表中,在与不在都会创建一个新的解;

import java.util.ArrayList;

import java.util.List;

public class p78 {

public List> subsets(int[] nums) {

List> result=new ArrayList>();

backtrack(nums,0,new ArrayList(),result);

return result;

}

//回溯

private void backtrack(int []nums,int start,List list,List> result){

//每次进来都将元素链表加入result

result.add(new ArrayList<>(list));

for(int i=start;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 stringList=new ArrayList<>();

String testString="123";

stringList.add(testString);

testString="456";

System.out.println(stringList.get(0));

/**

* 测试object,因为list存放的是a对象,所以在使用add后再对a操作也会将a的值改变

*/

List 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> listList=new ArrayList<>();

List 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;

}

}

}

你可能感兴趣的:(java求幂)