【问题标题】:Copy contents from object to another without having same object reference, in Java在Java中将内容从对象复制到另一个没有相同的对象引用
【发布时间】:2012-01-12 18:09:55
【问题描述】:

我需要复制两个对象(都是堆栈)。

我想将临时对象的内容复制到当前对象中,然后清除临时对象的内容。

例如,对于一棵树,它会是这样的:

tree = tempTree;
tempTree.clear();

但是,树引用现在指向 temptree,如果我清除 temptree,它也会清除树。我查看了其他帖子,他们谈到了实现可克隆或执行复制构造函数,我确信在 Java 中有更好的复制对象的方法。

顺便说一下,我的对象是 Stack 对象。

如何在没有相同对象引用的情况下将内容从对象复制到另一个对象?

【问题讨论】:

  • 我认为这两个是你唯一的选择,而且它们也不是那么棘手
  • 然后我将使用复制构造函数。
  • 如果他们都是栈,你为什么不直接做stack = new Stack(); stack.addAll(tempStack); stack.reverse(); tempStack.clear();

标签: java object reference copy


【解决方案1】:

很遗憾,您必须自己编写代码。好消息是StackList 的一种类型,因此您可以很容易地复制它。

Stack stack = ...; //Existing stack
Stack tempStack = new Stack(); 
tempStack.addAll(stack);

现在 tempStack 和 stack 以相同的顺序引用同一组对象,但可以独立变异。

【讨论】:

    【解决方案2】:

    直接回答:创建一个新实例,然后将旧实例的内容复制或添加到新实例。这也是辅助方法、复制构造函数和可克隆实现在后台所做的事情,所以最终你会做同样的事情。

    关于实现可克隆,请在实际开始实施之前查看this question - 由于该讨论中概述和引用的原因,这可能是最不推荐的方法。

    复制构造函数可能是推荐的方法。

    【讨论】:

      【解决方案3】:

      如果复制对象具有相同的类类型并且可序列化,您也可以“仅”序列化和反序列化它。这样,您将获得的不仅仅是一个浅拷贝,而是一个完整的新对象树。周围有一些实用程序类可以帮助解决这个问题。 Apache commons 有一个,我不是 100% 确定,但我认为 jdk5 中甚至有一个。不过我得把它挖出来。

      【讨论】:

        【解决方案4】:

        看看Object.clone()http://docs.oracle.com/javase/1.4.2/docs/api/java/lang/Object.html#clone()

        Stack 扩展了实现可克隆的 Vector,因此您可以简单地执行:

        Stack stackb = stacka.clone(); 
        

        【讨论】:

        • -1, Object.clone 坏了,只产生一个浅拷贝;此评论也适用于@roymustang86
        • 没有说明堆栈包含复杂对象。鉴于此处的信息,clone 没有理由不可行。
        • 这也行。但如果您的 Stack 包含原语,那么 clone 可能会更容易。
        猜你喜欢
        • 2020-03-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-02-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-10-24
        相关资源
        最近更新 更多