JAVA中的mutate数组

时间:2014-06-10 17:24:38

标签: 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]);
    }
}

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

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

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

4 个答案:

答案 0 :(得分:8)

  

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

你没有改变NewArray。您正在更改NewArray的值所引用的数组。它是这样的:

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

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

MyArrayNewArray的值都指向同一个数组,因此如果您通过一个变量对数组进行更改,那么当您仍然看到更改时然后查看数组 via 一个不同的变量。

  

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

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

对于String,我怀疑您正在更改变量的值以引用不同的String对象 - 而不是更改String的内容对象本身(你可以' t - 字符串在Java中是不可变的)。例如:

String x = "first";
String y = x;
x = "second"; // This doesn't change the value of `y`

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

int i = 10;

就像有一张名为i的纸张,上面的值为10。

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

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

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

答案 1 :(得分:1)

发生这种情况的原因是,当您说int[] NewArray = MyArray;时,这会将MyArray引用复制到NewArray

这是您复制引用的原因是因为您调用new运算符来实例化一个新数组。

因此,当您说NewArray[x]时,它指向x内存中的MyArray位置(因此MyArray的内存中的值)。执行int[] NewArray = MyArray;时未分配新内存,因为未调用new运算符。

答案 2 :(得分:1)

当你做=时,这是因为这使得新的obkect指向旧的obkect。因此,对新版本所做的任何更改都将反映在旧版本中,因为它们在技术上是相同的。 你应该使用array.clone来避免这种情况。

答案 3 :(得分:1)

你没有复制它的价值。你说:

Java create" MyArray"。 Java创建一个变量poiting at object

Java创建另一个数组" NewArray"这与MyArray相同

Java创建一个与MyArray

在同一对象上的变量

Java将NewArray [1]的值更改为10

Java会更改它所针对的对象的值,而不是变量本身。

希望你明白。 作为旁注,您应该使用[0]而不是[1]。数组从0开始,就像编程中的所有内容一样。因此,您创建的10个项目的数组从0开始,到9结束。请注意。