我有这个对象引用的问题让我发疯。当我从一个对象获得一个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;
}
答案 0 :(得分:5)
Java中的数组是一个Object,因此当您修改其元素时,它们会针对指向该数组的所有引用进行更改。 如果需要本地副本,则应克隆它。 E.g:
Integer[] origTimetable = bestSoFar.getChromosome();
Integer[] timetable = Arrays.copyOf (origTimetable, origTimeable.length);
答案 1 :(得分:1)
是的,这很正常。该方法返回对对象中包含的数组的引用。如果更改数组包含的内容,则会修改数组。
在返回数组之前,你必须制作一个数组的防御副本。
您可以使用List<Integer>
来避免这些副本,并返回此列表的不可修改的视图以防止其修改。然后,如果需要修改列表,则由调用者创建列表的副本:
return Collections.unmodifiableList(list);