【问题标题】:Does shallow copy work as deep copy in case of immutable objects in java?在java中不可变对象的情况下,浅拷贝是否可以作为深拷贝工作?
【发布时间】:2020-03-29 13:22:10
【问题描述】:

我在实践中阅读 java 并发。我遇到了这个sn-p,这让我有些困惑。 如果需要车队的不变视图,getLocations 可以改为返回位置图的浅表副本。由于 Map 的内容是不可变的,所以只需要复制 Map 的结构,不需要复制内容。

public Map<String,Point> getLocations(){
 return Collections.unmodifiableMap(new HashMap<String,Point>(locations));
}

返回车辆位置的不可修改但实时的视图

public Map<String,Point> getLocations(){
return unmodifiableMap; //unmodifiableMap = Collections.unmodifiableMap(locations);
}
public class Point{
 public final int x,y;
 public Point(int x, int y){
  this.x = x;
  this.y=y;
 }
}
public void setLocation(String id,int x,int y){
 if(locations.replace(id,new Point(x,y==null)
   //throw exception for invalid vehicle
}

这是否意味着new HashMap&lt;String,Point&gt;(locations) 正在对位置图进行深层复制,并在复制发生时通过为 Point 创建一个新对象来分配新的引用。不应该浅拷贝new HashMap&lt;String,Point&gt;(locations) 保留对 Point 对象的原始引用,并且更改在所有线程中可见。

【问题讨论】:

  • 你认为它为什么会执行深拷贝?我认为这里的重点是,对于不可变对象,仅复制引用而不是对象本身就足够了。
  • 但是为什么它声明更改在其他线程中不可见?
  • Collections.unmodifiableMap(new HashMap(locations)); vs 不可修改的地图;我的困惑就在这里。对于第一个更改在其他线程中不可见,第二个更改将是
  • 它在哪里谈到更改对其他线程可见?它只是说 - 你想要一份地图当前状态的副本(这意味着未来的变化不应该影响这个副本)还是反映未来变化的地图视图(这意味着它是由真实的地图)?
  • (那个Point类应该是final。)

标签: java hashmap


【解决方案1】:

不需要深拷贝,因为 Point 对象是不可变的,无法更改。这是断言的:

由于 Map 的内容是不可变的

如果 Point 对象是可变的,您实际上必须进行深层复制。

如果 getLocations 是指对地图“结构”变化的可见性,这两种实现之间的区别。第一个实现返回地图的副本不可修改的视图。如果在方法返回后添加或删除位置,则在此方法返回的地图中将不可见。第二个返回地图本身的不可修改视图。方法返回后所做的任何更改将对调用者可见。

【讨论】:

  • Collections.unmodifiableMap(new HashMap(locations)); vs 不可修改的地图;我的困惑就在这里。首先,更改在其他线程中不可见,其次是
  • 对于第一种情况,我相信我明白你在说什么。由于 setlocation 每次调用它时都使用新的引用来指向,并且来自 get 位置的地图必须指向旧的引用,所以我们看不到更新的值。但我不明白为什么 collections.unmodifiablemap 没有发生同样的事情,因为它也只是原始地图位置的副本。 collections.unmodifiablemap 是否指向与原始地图相同的地址?
  • Collections.unmodifiablemap 不是地图位置的副本,它是“不可修改的视图”。它不会创建副本,而是调用您传递给它的映射中的方法。
  • 非常感谢,它现在可以解决问题了。感谢您的帮助
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-12
  • 1970-01-01
  • 1970-01-01
  • 2015-01-13
  • 2011-09-05
  • 1970-01-01
相关资源
最近更新 更多