JAVA中的mutate数组

cod*_*tte -6 java arrays

public class example
{
    public static void main(String[] args)
    {
        int[] MyArray = new int[10];
        MyArray[1] = 5;
        int[] NewArray = MyArray;
        NewArray[1] = 10;    
        System.out.println(MyArray[1]);
    }
}
Run Code Online (Sandbox Code Playgroud)

为什么打印出系统10而不是5

好像我们在对元素所做的任何改变NewArray,MyArray都会跟着变,为什么呢?

我复制这个模式以启动类似int,字符串变量,但它们不像上面那样,为什么?谢谢你,我是CS编程新手.

Jon*_*eet 8

看起来我们对NewArray中的元素所做的任何更改,MyArray都会改变,为什么?

你没有改变NewArray.您正在更改NewArray引用值的数组.就像这样:

  • NewArray 是一个变量(非常规命名,但嘿)
  • NewArray是参考
  • 引用是指一个对象

区分变量,引用和对象真的非常重要.不要担心它不会立刻来找你 - 这是很多人第一次遇到像Java这样的语言时所经历的阶段.

的值MyArray,并NewArray都指向同一个数组,所以如果你更改了阵列通过一个变量,你仍然可以看到的变化,当你再看看阵列通过不同的变量.

我复制这个模式以启动类似int,字符串变量,但它们不像上面那样,为什么?谢谢你,我是CS编程新手.

因为int,这是一个值类型 - int变量的值是数字本身,而不是对象的引用.

因为String,我怀疑你正在改变变量的值来引用一个不同的String对象 - 改变String对象本身的内容(你不能改变它 - 字符串在Java中是不可变的).例如:

String x = "first";
String y = x;
x = "second"; // This doesn't change the value of `y`
Run Code Online (Sandbox Code Playgroud)

我喜欢将变量视为纸张.对于值类型变量,该值只写在纸上:

int i = 10;
Run Code Online (Sandbox Code Playgroud)

就像有一张名字的纸,i价值10.

对于类和数组(它们是引用类型),纸上的值不是对象 - 它是导航到对象的一种方式.有点像把某人的家庭住址写在一张纸上.

假设您有两张纸,上面写有相同的地址.如果你把其中一个擦掉并写一个不同的地址,那么如果有人看着另一张纸然后去那个房子会发生什么事情,这并没有改变.这就像String上面的例子.

然而,数组示例更像是这样:我在两张纸上写下我的家庭地址,并将它们交给Fred和Ginger.弗雷德读取地址,访问我家,并将前门涂成红色.(他正在修改物体 - 我的房子 - 根本没有更换他的纸张.)现在,如果Ginger读到的纸上的地址并访问我的家,他会看到一个红色的前门.