【问题标题】:Does the iterator give me a deep copy?迭代器会给我一个深拷贝吗?
【发布时间】:2013-07-09 15:28:08
【问题描述】:

我希望我现在只是感到困惑,因为我的 Java 程序表现得很奇怪。

我有以下代码:

Iterator<Entry<DateTime, Double>> itCur = this.curIntervalValues.entrySet().iterator();

Entry<DateTime, Double> last = null;
while (itCur.hasNext()){
  Entry<DateTime, Double> curr =  itCur.next();
  //more code between
  last = curr;
}

我的问题很简单:last = curr; 是否制作了curr 的深层副本? 或者如果curr 发生变化,last 现在每次都会变化吗?

【问题讨论】:

  • 您还没有说明您的 Java 程序的行为方式,或者 curIntervalValues 是什么,或者您希望 curr 以何种方式发生变化。如果您可以发布一个简短但完整的程序来演示该问题,将会有所帮助。
  • curIntervalValues代表什么数据结构?
  • @sanbhat 看起来像 Map
  • 是的,它 curIntervalValues 是一个 Map
  • 这正是常规行为——您不是在使用对象,而是在使用参考对象。

标签: java iterator copy deep-copy


【解决方案1】:

执行last = curr时,last不会是当前项的副本,而是当前项的引用。因此,如果您编辑其字段,您也将编辑 curr 对象引用的字段。例如,如果你执行

System.out.println(last.getSomeProperty());
last.setSomeProperty(newValue);
System.out.println(last.getSomeProperty());

它会打印出来

oldValue
newValue

您的参考资料也会在您的收藏中进行修改。

如果curr 发生变化,last 现在每次都会变化吗?

简短回答:是的。


根据您的评论,您似乎想要克隆由curr 处理的数据。如果是这样,我建议您采用此处所述的方法之一:Java: recommended solution for deep cloning/copying an instance

【讨论】:

  • 感谢您的回答!有没有一种简单的方法来制作 curr 的深层副本?
  • @cruxi 答案已更新。请参考我提供的链接。
【解决方案2】:

Entry&lt;DateTime, Double&gt; 是一个对象,因此它是通过引用存储的,这意味着只有对象在内存中的位置存储在变量中。所以是的,如果你这样做 last = curr,如果你改变 currlast 将会改变。

【讨论】:

    猜你喜欢
    • 2013-10-04
    • 1970-01-01
    • 2013-03-14
    • 2010-10-13
    • 1970-01-01
    • 2012-04-12
    • 2013-08-23
    • 1970-01-01
    • 2015-01-13
    相关资源
    最近更新 更多