为什么即使我不选择更新它,我的阵列也会更新

时间:2012-12-12 07:24:29

标签: java

我有点困惑为什么会发生这种情况。如果答案显而易见,我很抱歉,我在Java方面还很陌生。
所以我认为我已经设置了int[] returning,因此只有在我选择更新时它才会更新,但出于某种原因,它会在每次temp[]更改时更新。这是代码。请随意询问某些不清楚的事情,以便我能帮助您。

 public int[] generateTable(Graph g, int index, int cap, int[] current, int[] edges, int count) {
         int truthAmount = 0;   
         int result = Integer.MAX_VALUE;
         int[] temp = new int[count];
         int k = 0;
         int[] returning = new int[count];
         for(int i = 0; i < Math.pow(2, count); i++){
            for(int j = count-1; j>=0; j--){
               int num = (i/(int) Math.pow(2, j))%2;
               temp[k] = num;
               if(temp[k] == 0)
                  truthAmount++;
               k++;

            }
            if(truthAmount >= cap){
               result = FFAHelper(g, temp, edges);
               if(result < min){
                  min = result;
                  returning = temp;
               }
            }
            k = 0;
            truthAmount = 0;
         }

         return returning;
      } 


它基本上做的是生成二进制表,其中0表示真,1表示假。它只会继续执行FFAHelper方法,如果trues的数量至少是cap的数量(这是图形/边缘类的全部,我知道它不是图形/边缘类的传统设置但是我不得不同意这样做)所以基本上它不会继续使用FFAHelper而不使用truthAmount至少是边缘量。 同样,问题是,即使它没有通过if条件,它也会更新returning。 谢谢你们的帮助和时间!

4 个答案:

答案 0 :(得分:7)

returning = temp.clone();使用此代替returning = temp。 如果您使用returning = temp,则会将temp参考值分配给returning

因此,每当您更新temp时,它也会更新返回。

对于这种情况,如果您使用clone方法。然后它将 创建一个temp副本并分配给返回 。 因此,即使您更新temp,它也不会更新returning,因为临时值和返回值的参考值不同。

答案 1 :(得分:4)

returning = temp;

基本上当你这样做时,返回和临时引用相同的对象

答案 2 :(得分:2)

当你这样做时

returning= temp

你说等于整个返回的数组。即。在相同的内存位置返回临时温度

你应该做的是

returning= temp.clone()

将一个号码等同于另一个号码。因此返回和临时占用不同的内存空间

答案 3 :(得分:1)

如果您不想更改返回数组,则应克隆temp并将克隆值分配给返回数组。

在这种情况下,temp.clone()可以工作,因为你只有原始类型的数组。 如果数组中有复杂的对象,那么你应该注意克隆数组中的每个对象,因为temp.clone()(默认实现)不会执行真正的深层复制。