对象引用Java

对象引用Java,java,arrays,object,reference,Java,Arrays,Object,Reference,我有一个对象引用的问题,这让我发疯。当我从一个对象获取一个Integer[]数组并修改这个变量中的一些元素时,它在对象中也会被修改,而不使用任何set方法,这是正常的吗?例如,下面我想在本地修改时间表变量,但不想在bestSoFar对象中修改。我该怎么做?这里到底发生了什么 for (IntTuple examRel: examsRel) { int[] examsTogether = examRel.getData(); double maxFitness = 0.

我有一个对象引用的问题,这让我发疯。当我从一个对象获取一个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;
}
for(IntTuple examRel:examRel)
{   
int[]examsTogether=examRel.getData();
双最大适应度=0.0;
整数[]timeline=bestSoFar.getChrome();
对于(int i=0;imaxFitness)
{
maxFitness=此Fitness;
Bessofar=该染色体;
}
}
}
回归最佳状态;
}

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

Integer[] origTimetable = bestSoFar.getChromosome();
Integer[] timetable = Arrays.copyOf (origTimetable, origTimeable.length);

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

Integer[] origTimetable = bestSoFar.getChromosome();
Integer[] timetable = Arrays.copyOf (origTimetable, origTimeable.length);

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

在返回阵列之前,您必须制作阵列的防御副本

您可以使用
列表
来避免这些副本,并返回此列表的不可修改视图以防止其修改。如果调用者需要修改列表,则将由调用者创建列表的副本:

return Collections.unmodifiableList(list);

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

在返回阵列之前,您必须制作阵列的防御副本

您可以使用
列表
来避免这些副本,并返回此列表的不可修改视图以防止其修改。如果调用者需要修改列表,则将由调用者创建列表的副本:

return Collections.unmodifiableList(list);

显然,
getchromome()
正在返回对底层存储的引用,而不是首先创建一个副本。是的,这是正常的,因为您获得了对
Integer[]
数组的引用。如果需要其他行为,则应该在返回数组之前考虑克隆数组。数组是一个普通对象。您在其上有一个引用,您可以更改其成员。您必须创建它的副本。您可以使用Arrays.copyOf()进行复制,因此我需要将数组复制到另一个整数[]数组中。例如,显然
getchromose()
正在返回对底层存储的引用,而不是首先创建一个副本。是的,这是正常的,因为您获得了对
整数[]
数组的引用。如果需要其他行为,则应该在返回数组之前考虑克隆数组。数组是一个普通对象。您在其上有一个引用,您可以更改其成员。您必须创建它的副本。您可以使用Arrays.copyOf()来实现它,因此我需要将数组复制到另一个整数[]数组中,例如?谢谢您的回答。因此,如果我有一份时间表的副本并修改它,那么染色体上的时间表就不会被修改。但是如果数组是一个基元int[],这会避免吗?@Bernice否,使用基元ints不会有帮助-这里的对象引用是数组本身-您的代码不是在修改现有元素,而是在用不同的元素切换它们。同样的问题也会发生在原始
int
s的数组中。好的,bestchrome的对象也是如此。在我做的最好的事情中,sofat=这条染色体,我会通过对两个物体有相同的参照使它们相等,对吗?@Bernice yup。两个变量都指向同一个引用。谢谢你的回答。因此,如果我有一份时间表的副本并修改它,那么染色体上的时间表就不会被修改。但是如果数组是一个基元int[],这会避免吗?@Bernice否,使用基元ints不会有帮助-这里的对象引用是数组本身-您的代码不是在修改现有元素,而是在用不同的元素切换它们。同样的问题也会发生在原始
int
s的数组中。好的,bestchrome的对象也是如此。在我做的最好的事情中,sofat=这条染色体,我会通过对两个物体有相同的参照使它们相等,对吗?@Bernice yup。这两个变量将指向同一个引用。