求幂集的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;

}

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值