zoukankan      html  css  js  c++  java
  • 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;
            }
        }
    }
    
  • 相关阅读:
    jquery 插件 lettering.js
    css中一些生僻却好用的属性
    mui-5+api(plus)加载顺序
    网易云音乐mp3外链、真实地址下载方法
    移动端a标签的妙用(拨号、短信、邮件等)
    Android上架mui-app
    ios-app证书配置、打包提交
    前端兼容性问题
    米拓CMS学习总结
    1) 链表顺序存储---之二代码
  • 原文地址:https://www.cnblogs.com/ming-szu/p/8975598.html
Copyright © 2011-2022 走看看