首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >对象引用Java

对象引用Java
EN

Stack Overflow用户
提问于 2014-05-03 17:17:10
回答 2查看 79关注 0票数 1

我有一个对象引用的问题,这让我发疯了。当我从一个对象获得一个Integer[]数组并修改这个变量中的一些元素时,它也会在对象中被修改而不使用任何set方法,这是正常的吗?例如,下面我想在本地修改时间表变量,但不要修改bestSoFar对象中的时间表变量。我该怎么做?这里到底发生了什么?

代码语言:javascript
复制
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;
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-05-03 17:20:28

Java中的数组是一个对象,所以当您修改它的元素时,它们会更改指向该数组的所有引用。如果你想要一个本地副本,你应该克隆它。例如:

代码语言:javascript
复制
Integer[] origTimetable = bestSoFar.getChromosome();
Integer[] timetable = Arrays.copyOf (origTimetable, origTimeable.length);
票数 5
EN

Stack Overflow用户

发布于 2014-05-03 17:21:10

是的,这很正常。该方法将返回对对象中包含的数组的引用。如果您更改了数组所包含的内容,则会对数组进行修改。

在返回数组之前,必须对数组进行防御性复制。

您可以使用List<Integer>来避免这些副本,并返回此列表不可修改的视图,以防止对其进行修改。然后,如果调用方需要修改列表,则由调用方创建该列表的副本:

代码语言:javascript
复制
return Collections.unmodifiableList(list);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23447525

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档