工作4年才意识到java深拷贝和浅拷贝

【背景介绍】

【接口介绍】基于springboot的在线解冲突平台,查询冲突文件接口,返回所有冲突文件;
【需求】返回里面包含的二进制冲突文件

【问题现象】

清楚的是二进制文件<冲突文件总数,实际返回的冲突文件总数等于二进制冲突文件

【原始代码】

class FileTree{
	String path;//文件路径
	String fileName;//文件名
	String fileType;//类型:direction、file
	List<FileTree> children;
	int conflictNum;
	int isBinary;//0或1
//其他省略
}
//获取二进制文件
public List<FileTree> getBinaryFile(List<FileTree> files){
	List<FileTree> binaryFiles = new ArrayList<>();
	for(FileTree fileTree:files){
		if("direction".equals(fileTree.fileType){
			List<FileTree> tmp = getBinaryFile(fileTree.children);
			if(!tmp.isEmpty()){
				fileTree.children = tmp;//******
				binaryFiles.add(fileTree);
			}
		}else{
			if(fileTree.isBinary==1){
				binaryFiles.add(fileTree);
			}
		}
	}
}

【问题原因】

这里//******直接对原始冲突文件列表的children进行了重置

【修改代码】

class FileTree{
	String path;//文件路径
	String fileName;//文件名
	String fileType;//类型:direction、file
	List<FileTree> children;
	int conflictNum;
	int isBinary;//0或1
//其他省略
	public FileTree clone(){
		FileTree fileTree = new FileTree();
		fileTree.path = this.path;
		fileTree.fileName = this.fileName;
		fileTree.fileType = this.fileType;
		fileTree.children = this.children;
		fileTree.conflictNum = this.conflictNum;
		fileTree.isBinary = this.isBinary;
		return fileTree; 
	}
}
//获取二进制文件
public List<FileTree> getBinaryFile(List<FileTree> files){
	List<FileTree> binaryFiles = new ArrayList<>();
	for(FileTree fileTree:files){
		FileTree fileTreeNew = fileTree.clone();
		if("direction".equals(fileTree.fileType){
			List<FileTree> tmp = getBinaryFile(fileTree.children);
			if(!tmp.isEmpty()){
				fileTreeNew.children = tmp;//******
				binaryFiles.add(fileTreeNew);
			}
		}else{
			if(fileTree.isBinary==1){
				binaryFiles.add(fileTreeNew);
			}
		}
	}
	return binaryFiles;
}

参考自:Java 对象的浅拷贝和深拷贝

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值