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

原文地址:https://www.cnblogs.com/ming-szu/p/8975598.html

时间: 2024-07-29 03:36:52

Java求幂集与List的浅拷贝深拷贝问题的相关文章

java求两个集合的差集

public static void main(String[] args) {Set set = new HashSet();Set set1 = new HashSet();set.add("sanny");set.add("mary");set.add("bill");set.add("tom");set.add("tony");set.add("mark");set.add(&q

JS中有关对象的继承以及实例化、浅拷贝深拷贝的奥秘

一.属性的归属问题 JS对象中定义的属性和方法如果不是挂在原型链上的方法和属性(直接通过如类似x的方式进行定义)都只是在该对象上,对原型链上的没有影响.对于所有实例共用的方法可直接定义在原型链上这样实例化的的时候就不用对每个实例定义该属性方法,所有的实例均具有该方的引用见最后的输出. function Myclass(){ this.x=" x in Myclass"; this.get=function(){}//每次实例化对象,每个对象的该方法都是独立的,是不相同的 } Mycla

两种求幂集的方法

今天这一题是求幂集.小学数学都忘得差不多了- 幂集是什么? 幂集(power set)是一个集合的所有子集.比如[1, 2, 3]的幂集就是: [[], [1], [2], [1, 2], [3], [1, 3], [2, 3], [1, 2, 3]] 不过这道题有一个额外的要求: 在求幂集时要以"深度优先搜索"(depth-first search)的形式进行.也就是说,对于集合的每个元素,都有"取"和"舍"两种选择:在深度优先时,我们优先选择

java求阶乘

//阶乘 public static int rec(int n){ if(n==1){ return 1; }else{ return n*rec(n-1); } } java求阶乘

用Java求字符串数组的的交集和并集

package com.array; import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Set; import java.util.Map.Entry; public class StringArray { pu

$.extend()浅拷贝深拷贝

参考网址:http://bijian1013.iteye.com/blog/2255037 jQuery.extend() 函数用于将一个或多个对象的内容合并到目标对象. 注意:1. 如果只为$.extend()指定了一个参数,则意味着参数target被省略.此时,target就是jQuery对象本身.通过这种方式,我们可以为全局对象jQuery添加新的函数.2. 如果多个对象具有相同的属性,则后者会覆盖前者的属性值.   1 <!DOCTYPE html> 2 <html lang=&

Java求素数

Java求素数 package test1; import java.util.*; public class Demo { public static void main(String[] args) { Scanner scan = new Scanner(System.in); int a = scan.nextInt(); if(a==2){ System.out.println("2"); System.exit(0); } for(int b=3;b<a;b++) {

年年有余之java求余的技巧集合

背景 传说里玉皇大帝派龙王马上降雨到共光一带,龙王接到玉皇大帝命令,立马从海上调水,跑去共光施云布雨,但粗心又着急的龙王不小心把海里的鲸鱼随着雨水一起降落在了共光,龙王怕玉皇大帝责怪,灵机一动便声称他是派鱼到共光,希望百姓可以年年有余,并请求玉皇大帝将这条鱼任命为鱼神,保佑人间太平可以年年有余. 年年有余 java 求余操作初阶 java中也有余的规范[jls-15.17.3],废话不说,直接上代码,从中我们可以学到很多技巧: 例1: int a = 5%3; // 2 int b = 5/3;

Java原型模式之浅拷贝-深拷贝

一.是什么? 浅拷贝:对值类型的成员变量进行值的复制,对引用类型的成员变量仅仅复制引用,不复制引用的对象 深拷贝:对值类型的成员变量进行值的复制,对引用类型的成员变量也进行引用对象的复制 内部机制: (1)关于Object类的clone方法 默认实现为"浅拷贝",重写Object类中的clone方法.Java中全部类的父类都是Object类,Object类中有一个clone方法.作用是返回对象的一个拷贝,可是其作用域是protected类型的,一般的类无法调用,因此Prototype类