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

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

java 复制代码
paths.add(path);
path.clear();

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

java 复制代码
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);
    }
}
相关推荐
鸡蛋灌Bean20 分钟前
Java常用设计模式大全
java·开发语言·设计模式
喝可乐的布偶猫21 分钟前
Java-----韩顺平单例设计模式学习笔记
java·笔记·设计模式
AskHarries34 分钟前
深入探索Java虚拟机的神秘接口:JVMTI
java·jvm
风象南36 分钟前
SpringBoot应用开机自启动与进程守护配置
java·spring boot·后端
字节卷动1 小时前
【牛客刷题】活动安排
java·算法·牛客
fouryears_234171 小时前
Spring核心原理的快速入门:快速了解IoC与DI
java·后端·spring
顽疲1 小时前
从零用java实现 小红书 springboot vue uniapp(13)模仿抖音视频切换
java·vue.js·spring boot
星辰离彬1 小时前
Java 与 MySQL 性能优化:MySQL连接池参数优化与性能提升
java·服务器·数据库·后端·mysql·性能优化
半桔1 小时前
【Linux手册】从接口到管理:Linux文件系统的核心操作指南
android·java·linux·开发语言·面试·系统架构
nightunderblackcat2 小时前
新手向:实现ATM模拟系统
java·开发语言·spring boot·spring cloud·tomcat·maven·intellij-idea