对象引用Java

时间:2014-05-03 17:17:10

标签: java arrays object reference

我有这个对象引用的问题让我发疯。当我从一个对象获得一个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;
}

2 个答案:

答案 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);