• java中的深度复制和浅复制的BUG


    刷题刷到LeetCode回溯DFS的算法题39题的时候,碰见一个Arraylist里面的bug,其中dfs函数里面的第一个if判断里面的语句

    paths.add(path);
    path.clear();
    
    • 1
    • 2

    其中path是添加了path,但是添加之后path.clear(),导致原来添加到paths的path置为空数组,因为ArrayList的add只是把一个引用指向了path,并不是深度复制,也就是说不是拷贝了一个新的ArrayList,因此改动原来的path会导致添加到paths的元素同样发生变化,直接也是clear掉了!

    package org.example.SolutionTest3;
    
    import java.util.ArrayList;
    import java.util.Arrays;
    import java.util.List;
    public class Solution {
        public List<List<Integer>> combinationSum(int[] candidates, int target) {
            int n=candidates.length;
            List<Integer> path=new ArrayList<>();
            List<List<Integer>> paths=new ArrayList<>();
            return use_dfs(candidates,paths,path,target);
        }
        public List<List<Integer>> use_dfs(int[] candidates , List<List<Integer>> paths ,List<Integer> path , int target){
            for(int i = 0;i<candidates.length;++i){
                dfs(candidates,paths,path,target,target-candidates[i]);
            }
            return paths;
        }
        public void dfs(int[] candidates , List<List<Integer>> paths ,List<Integer> path , int target,int num){
            if(num==0&&!path.isEmpty()){
                System.out.println("path = " + path);
                paths.add(path);
                path.clear();
                //path=new ArrayList<>();
                return;
            }else if(num<0&&!path.isEmpty()){
                path.remove(path.size()-1);
                return;
            }
    
            for( int i = 0 ; i<candidates.length;++i){
                int next_num = num-candidates[i];
                if(next_num<0){
                    continue;
                }
                path.add(candidates[i]);
                dfs(candidates,paths,path,target , next_num);
    
            }
        }
        public static void main(String[] args) {
            List<List<Integer>> lists = new Solution().combinationSum(new int[]{
                            2, 3, 6, 7
                    },
                    7);
            System.out.println(lists);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
  • 相关阅读:
    idea热部署Jrebel插件和自动手动三种方式实现
    transformers架构实现
    网络安全考研院校推荐
    P06 GridBagLayout
    OpenCV颜色识别及应用
    C语言编程陷阱(五)
    数据中心的防雷接地
    软件项目管理(第二版 宁涛)问答题(个人背诵)
    渲染时间过长?这些参数设置学起来
    Scrapy08:scrapy-deltafetch,让爬虫有了记忆
  • 原文地址:https://blog.csdn.net/weixin_46028606/article/details/134459791