在Java中,将内容从对象复制到另一个,而没有相同的对象引用

时间:2012-01-12 18:09:55

标签: java object reference copy

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

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

例如,对于树,它将类似于:

tree = tempTree;
tempTree.clear();

但是,树参考现在指向temptree,如果我清除temptree,它也将清除树。我看了其他帖子,他们谈到了实现clonable或者做了一个复制构造函数,我确信有一种更好的方法可以用Java复制对象。

我的对象就像Stack对象一样。

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

4 个答案:

答案 0 :(得分:1)

不幸的是,您必须自己编写代码。好消息是Stack是一种List,所以你可以很容易地复制它。

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

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

答案 1 :(得分:0)

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

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

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

答案 2 :(得分:0)

如果复制对象具有相同的类类型且可序列化,那么您也可以"只是"序列化和反序列化它。这样你就不会得到一个浅的副本,而是一个完整的新对象树。有一些实用程序类可以帮助解决这个问题。 Apache公共有一个,我不是100%肯定,但我认为在jdk5中甚至有一个直接。我不得不把它挖出来。

答案 3 :(得分:-1)

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

Stack extends Vector实现了cloneable,所以你可以简单地执行:

Stack stackb = stacka.clone();