【发布时间】:2014-05-03 17:17:10
【问题描述】:
我有这个对象引用的问题,这让我发疯。当我从对象中获取 Integer[] 数组并修改此变量中的某些元素时,它在对象中也被修改而不使用任何 set 方法是否正常?例如下面我想在本地修改时间表变量,而不是在 bestSoFar 对象中。我怎样才能做到这一点?这里到底发生了什么?
for (IntTuple examRel: examsRel)
{
int[] examsTogether = examRel.getData();
double maxFitness = 0.0;
Integer[] timetable = bestSoFar.getChromosome();
for (int i=0; i < noOfTimeslots; i++)
{
for (int j=0; j < examsTogether.length; j++)
{
timetable[examsTogether[j]] = i;
}
BestChromosome thisChromosome = evaluateChromosome(new BestChromosome(timetable));
double thisFitness = thisChromosome.getFitness();
if (thisFitness > maxFitness)
{
maxFitness = thisFitness;
bestSoFar = thisChromosome;
}
}
}
return bestSoFar;
}
【问题讨论】:
-
显然
getChromosome()正在返回对底层存储的引用,而不是先创建副本。 -
是的,这很正常,因为你得到了
Integer[]数组的引用。如果您需要其他行为,则应考虑在返回之前克隆数组。 -
一个数组是一个普通的对象。你有它的参考,你可以改变它的成员。您必须创建它的副本。你可以使用 Arrays.copyOf (docs.oracle.com/javase/7/docs/api/java/util/…)
-
所以我需要将数组复制到另一个 Integer[] 数组中?
标签: java arrays object reference