【问题标题】:Arrays of primitive data types vs. primitive data type manipulation原始数据类型数组与原始数据类型操作
【发布时间】:2017-04-30 11:22:04
【问题描述】:

这是怎么回事

int[] a = {0, 1};
int[] b = a;
a[0] = 1;
b[0] = 2;
System.out.println(a[0] + b[0]);

打印 4 和 this

int a = 2;
int b = a;
b += 3;
System.out.println(a);

打印 2.

这是否与数组如何使用 byReference 以及在纯原始操作使用 byValue 时可以操作原始值有关?

【问题讨论】:

    标签: java arrays types primitive


    【解决方案1】:

    int 是一个原语,而不是一个对象,所以它只包含一个值。当您将一个原语分配给另一个 (a = b) 时,您只是将第一个原语赋予与第二个相同的值。因此,当您更改第二个时,它对第一个没有影响。

    int[] 是一个数组,它是一个对象,数组的所有元素也是。这意味着它们实际上指向内存中的一个位置。当您将一个对象分配给另一个对象(ab 是数组时,a[0] = b[0] 甚至 a = b),您将它们都指向内存中的同一位置。因此,当您更改第二个时,它也会更改第一个,因为它们实际上指向的是同一件事。

    如果您希望 b[0] 仅包含 a[0],您可以这样做:

        int[] a = {1, 2};
        int [] b = new int[2];
        b[0] = Arrays.copyOf(a,1)[0];
    

    换句话说,当你只复制 a 的第一个元素时,新数组的第 0 个元素。

    更新:您也可以只通过原语运行它,如下所示:

    int x = a[0];
    b[0] = x;
    

    现在我认为它可能更有效。

    【讨论】:

      【解决方案2】:

      在 Java 中,数组变量是一个对象引用。

      {0, 1} 是用于创建具有给定值的数组的简写语法。以下都是一样的:

      int[] a = {0, 1};
      
      int[] a = new int[] {0, 1};
      
      int[] a = new int[2];
      a[0] = 0;
      a[1] = 1;
      

      因此,当您编写 b = a; 时,b 变量被分配了与 a 变量相同的引用值,即它引用相同的数组。因此,a[0]b[0] 引用了相同的值。

      换一种说法:数组变量存储对数组的引用。它不存储数组本身,所以b = a; 复制数组。

      【讨论】:

        【解决方案3】:

        第一个例子很简单,因为数组ab 都指向内存中的同一个对象,改变一个会影响另一个。换句话说,当您执行b = a; 时,您实际上是从a 复制reference 并将其存储到b,这意味着ab 都持有一个对数组的引用

        第二个例子你基本上是复制变量a并将其存储到b中,a和@之间没有no关系987654331@,更改一个不会影响另一个。

        【讨论】:

          猜你喜欢
          • 2011-09-04
          • 1970-01-01
          • 2016-01-21
          • 1970-01-01
          • 2011-10-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多