为什么我的阵列SC与SN相同?

时间:2014-11-03 23:13:50

标签: java arrays

public static int[] tranzitie(int[] stare, int x, int y) {
    stare[x] = y;
    return stare;
}

int[] SC = {3,1,1,1};
int[] SN = {3,1,1,1};                             

SN = tranzitie(SC, x, y);

//当我这样做时,我想只改变SN //但在我的情况下SN = SC

2 个答案:

答案 0 :(得分:1)

如果您不想更改原始数组,则必须制作防御性副本并改为使用该副本,例如:

public static int[] tranzitie(int[] stare, int x, int y) {
    int[] copy = stare.clone();
    copy[x] = y;
    return copy;
}

请参阅此related discussion,其中详细说明了如何在Java中传递方法参数。

答案 1 :(得分:0)

在Java中,数组是对象,当您分配int[]变量或将其作为参数传递时,实际上是将引用分配或传递给数组对象。 / p>

因此,在这次电话会议中:

SN = tranzitie(SC, x, y);

tranzitie获取引用SC数组,而不是它的副本。 stare参数将引用相同的数组。因此,当方法说

stare[x] = y;

它实际修改了 SC ---不是SC副本,而是实际的数组本身。

当方法显示return stare时,由于stare是对SC数组对象的引用,因此该方法将返回该引用。然后为此分配SN。结果是SNSC现在是对同一数组的引用。您之前创建的数组:

int[] SN = {3,1,1,1}; 

将不再可访问(除非您将引用存储在其他位置)。

如果这不是您想要的,那么您必须小心处理您的阵列; Arrays中的CopyOfCopyOfRange方法有助于制作数组或数组部分的副本。