2011-08-26 52 views
1

我有2所列出并感到有点困惑添加对象到他们两个这样的:某对象插入2个集合

TestClass e; 
List lst1; 
LinkedList lst2; 
... 
lst1.add(e); 
lst2.add(e); 

威尔lst1lst2e副本?或引用同一个对象e
如果第一个为真,如果TestClass不可克隆,代码如何复制e

回答

1

请问lst1lst2e副本?

这两个清单将有一个e中包含的值的副本。 (注意虽然,e包含参考而不是一个实际的对象。)

这意味着

  1. 两个列表将具有一个拷贝的每个参考TestClass物体e指在add点。

  2. TestClass对象的更改将从这两个列表引用中可见。

  3. 附加后执行e = null不会影响列表的内容(列表包含副本,还记得吗?;-)

+1

+1是的 - 这在技术上更加正确。我认为OP在想“e”作为对象本身,实际上它是对象的地址 –

2

他们将有相同的参考。如果您希望它是2个不同的属性,则必须手动复制值。

+0

我不认为OP想要 - 而只是想知道它是如何工作的。 –

2

第二个是正确的:两个集合都将持有对同一对象的引用。

0

这通过追溯到路过的老问题,通过参考VS传球值...

见本计算器question

两个lst1lst2将包含一个值(由变量表示3210),它将告诉JVM如何在堆内存中找到TestClass实例。如果通过访问elst1lst2来修改实例(只有一个实例),则所做的更改将在任何地方都可见!

改变这种行为的唯一方法是重写Object clone()TestClass函数并传递e.clone()add(...)功能。请指documentation

如果您不能修改TestClass你也可以自己克隆实例的任何原因(主要是要实现clone()TestClass)。使用new运算符创建一个新的TestClass实例e2,然后通过它的'getters'获取它的实例变量(请注意它包含其他自定义对象),并从e中将值设置为e2。这是丑陋的,我希望你拒绝这么做...