• 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
  • 相关阅读:
    面试官让你说说react状态管理?
    SSO 方案演进
    让div居中的方式的几种方法
    数据库实训复习(1)
    bug的生命周期都有那些阶段
    【powershell】入门和示例
    剑指 Offer 03. 数组中重复的数字
    第九周实验记录
    SpringCloud学习笔记(四)
    Mint_21.3 drawing-area和goocanvas的FB笔记(八)
  • 原文地址:https://blog.csdn.net/weixin_46028606/article/details/134459791