【问题标题】:Assigning two arrays equal to each other problems分配两个彼此相等的数组问题
【发布时间】:2018-11-26 22:19:24
【问题描述】:
public static void main(String[]args) {


    int[] x = {1, 2, 3, 4};
    int[] y ;
    y = x;
    x[1] = 11;
    x = new int[2];

    x[0]=99;
    for (int i = 0; i < y.length; i++)
      System.out.print(y[i] + " ");
    System.out.println("");
    for (int i = 0; i < x.length; i++)
          System.out.print(x[i] + " ");
}

答案是

1 11 3 4 
99 0

我的问题是我认为当您分配两个数组时,它们共享相同的更改,因为它们是对象......就像我设置 x[1] = 11; 时它改变了 y 的值,所以你不应该仍然相同将其更改为 2 大小的数组后到 x,或者由于我正在更改大小,它们不再指向相同的地址?

【问题讨论】:

  • 您的代码创建了 2 个数组,一个长度为 4,一个长度为 2。作为参考,我们将它们称为 A4 和 A2。所以,x = A4, y = A4,然后x[1] = 11 表示您刚刚更改了 A4。 x = A2 然后 x[0] = 99 表示您刚刚更改了 A2。
  • 行 x = new int[2];确保创建一个新数组并将其分配给引用 x。而 y 仍然指的是前一个数组。

标签: java arrays pointers memory-management reference


【解决方案1】:
int[] x = {1, 2, 3, 4};

{1, 2, 3, 4} 被分配为一个数组。对它的引用分配给x

int[] y ;
y = x;

对同一数组的引用也分配给y

x[1] = 11;

xy 引用的数组现在是 {1, 11, 3, 4}

x = new int[2];

由于 Java 语义,一个新数组被分配为{0, 0}。对它的引用分配给x。现在xy 指的是两个不同的数组。没有调整大小。

x[0]=99;

x 引用的数组已更改,现在包含{99, 0}。这与y所指的数组无关,还是很高兴{1, 11, 3, 4}

【讨论】:

    【解决方案2】:
    x = new int[2];
    

    这一行创建了一个长度为 2 的 new 数组,然后使x 指向该新数组。此时原始数组只被y引用。

    x[0] = 99;
    

    这一行将 new 数组中的第 0 个元素分配给 99,因此原始数组保持不变。

    【讨论】:

      【解决方案3】:

      让我逐行介绍你的代码

      当你这样做时

      第一阶段:

      int[] x = {1, 2, 3, 4};

      HEAP中创建一个数组对象,并将这个INTEGER ARRAY OBJECT的地址分配给引用变量x

      第二阶段:

      int[] y ;
      y = x;
      

      创建了另一个可以存储整数数组对象的引用变量y,现在存储的地址与之前的变量x

      相同

      第三阶段:

      x = new int[2];
      

      通过使用关键字 new,我们指示 JVM 在长度为 heap 内创建一个 new 整数数组对象 2、将这个新创建的对象的地址发送到x里面。

      这意味着数据(前一个对象的地址)现在被新数据(新创建的对象的地址)重新分配。

      但这并不意味着引用变量y 中的地址也会被重新分配。

      这意味着它仍然在其中保存数据(前一个对象的地址),当您使用 for 循环打印两个数组时,您会得到如下输出:

      1 11 3 4

      99 0

      【讨论】:

      • 对于 404 Brain Not Found 这是一个非常好的答案 ;-) +1!
      • 我的答案旁边仍然没有得到那些多汁的+25分以及绿色刻度线:'(
      • 是的。 FeelsBadMan,希望我们也可以投票支持我们自己的东西;)
      【解决方案4】:

      如果你谈论这段代码..

      y = x;  // this actually only reference of same array is going to assign.
      

      在上面的代码中仅参考。即将分配,xy 都指的是同一个数组对象。

      因此,如果在 x 中所做的任何更改将自动反映到 y

      从这里开始

       x = new int[2];
      

      x 被分配了大小为 2 的新数组。因此,创建了一个大小为 2 的全新数组并将其分配给它。

      所以现在,如果x 中的任何更改不会反映到y,反之亦然。

      谢谢你:)

      【讨论】:

        【解决方案5】:

        我已根据变量和内存分配/内存引用发生的情况对您的代码进行了注释,如果清楚,请告诉我。

        public static void main(String[]args) {
        
        
            int[] x = {1, 2, 3, 4}; // x -> [1|2|3|4]
            //the reference x points to this data structure in memory
            int[] y ; // y (variable y is not yet pointing to anywhere in memory)
            y = x; // y, x  -> [1|2|3|4] x and y points to the same array
            x[1] = 11; //y,x -> [1|11|3|4] 
            x = new int[2]; //y -> [1|11|3|4] and x -> [0|0]
        
            x[0]=99; // y -> [1|11|3|4] and x -> [99|0]
            for (int i = 0; i < y.length; i++)
              System.out.print(y[i] + " ");
            System.out.print("");
            for (int i = 0; i < x.length; i++)
                  System.out.print(x[i] + " ");
        }
        

        【讨论】:

          【解决方案6】:

          使用关键字 new 后,将创建一个具有不同地址的新数组对象。 在第 4 行:x = new int[2];

          所以你正在为 x 分配一个新的数组对象。这不再是您在第 1 行中初始化的数组。因此值发生了变化。

          【讨论】:

            【解决方案7】:
            int[] x = {1, 2, 3, 4};
            int[] y ;
            y = x;
            

            直到第 3 行,x 和 y 都具有与初始化相同的数组值

            在Java中使用new的格式是 名称 = 新类型 [大小];

            x = new int[2];
            

            这将按照指定的方式为 x 分配内存(数组中的 2 个整数值)。这将覆盖 x 之前持有的值

            进一步初始化数组时的默认值是 0 表示数字类型 布尔类型为 false 引用类型为 NULL

            因此,数组的值 {0,0} 然后更改为 {99,0}。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2017-04-05
              • 1970-01-01
              • 1970-01-01
              • 2023-04-08
              • 2013-12-07
              • 2015-12-09
              • 2012-04-30
              相关资源
              最近更新 更多