java复制构造函数创建依赖副本
我实现了here中描述的复制构造函数。但问题仍然是,当我更新route_copy
时,相同的更新应用于route
。所以,我不明白我的代码中有什么错误
public class Route implements Comparable<Route> {
private List<Site> sites;
public Route()
{
sites = new ArrayList<Site>();
}
public Route(List<Site> sites)
{
this.sites = sites;
}
/**
* Copy constructor
*/
public Route(Route r) {
this(r.sites);
}
public void deleteSite(Site s) {
this.sites.remove(s);
}
}
public processData(Route route)
{
Route route_copy = new Route(route);
Site s = selectSite(route_copy);
route_copy.deleteSite(s); // !!! now 'route' does not contain an element 's'
}
# 1 楼答案
使用复制构造函数所做的只是使新的
Route
使用旧的Route
列表,因此对其中一个的任何更改都会立即影响另一个您需要做的是让复制构造函数创建一个新列表:
# 2 楼答案
问题是两个列表仍然指向同一个内存位置,因此,对一个列表的任何操作最终都会修改另一个列表
您可以尝试使用ArrayList的复制构造函数:
像这样:
但是请注意,对列表中的
Site
对象进行任何修改都可能会对存储在其他列表中的其他对象进行重新循环,具体取决于Site
对象的复杂程度# 3 楼答案
您的“复制构造函数”没有复制输入列表。试试像这样的东西
对于第二个构造函数
# 4 楼答案
在复制构造函数中,您只需执行浅复制,而需要执行深复制:
这里,您仍然在复制
list
的引用,它仍然指向相同的ArrayList
。您应该修改它以创建列表的副本。您可能还需要在arraylist中创建元素的副本,如下所示:检查此帖子-Shallow Copy vs Deep Copy.
# 5 楼答案
当然,它将创建从属副本,也称为浅层副本
您需要一份深入的副本