我遇到了一个完全让我困惑的奇怪问题。
我在项目中使用了WEKA,并且我想更改数据集的类值来测试一些东西;所以我将数据集保存到另一个名为d的值中,并使用setClassValue方法来更改类值。最后,我打印了d和dataset变量中每个实例的类值。
Instances d=dataset;for (int i = 0; i <dataset.size(); i++) { dataset.get(i).setClassValue(10); System.out.println(dataset.get(i).classValue()+ "\t" +d.get(i).classValue() );}
结果令人难以置信,d和dataset的类值都发生了变化。 为什么会这样?如何更改数据集的类值,同时要考虑到我需要保留原始数据集?
回答:
d=dataset
现在你有两个变量,它们都引用了同一个对象。
与C++不同,Java从不隐式地复制任何东西。
如果你想要一个对象的独立副本,你需要自己创建一个。
如果对象实现了Cloneable
,你可以使用clone()
来做到这一点。