【发布时间】:2021-05-25 18:32:52
【问题描述】:
我写了一个程序小java程序,它的行为不像我预期的那样:
import java.util.Arrays;
public class test1 {
static int[] kuerzesterWeg = new int[]{1,2,3};
public static void main(String[] args) {
int[] feld = new int[]{1,2,3};
kw = feld;
int S1 = feld[0];
System.out.println(Arrays.toString(kw));
int S2 = feld[1];
System.out.println(Arrays.toString(kw));
feld[1] = S1;
System.out.println(Arrays.toString(kw));
feld[0] = S2;
System.out.println(Arrays.toString(kw));
}
}
输出如下:
[1, 2, 3]
[1, 2, 3]
[1, 1, 3]
[2, 1, 3]
即使我没有更新 kw-variable,kw-variable 也会随着 feld-variable 的变化而变化
所以我的问题是:java中的“=”字符只是链接到变量还是我完全错了?
如果是链接,如何避免这种“链接”状态?
【问题讨论】:
-
这被称为“引用”,这就是
=运算符对对象所做的,而不是对原始类型所做的 -
如何避免?
-
是的,内存中有一个
int[]对象。它被两个变量引用:feld和kw。如果你想要一个副本,那么你需要复制数组(例如kw = Arrays.copyOf(feld, feld.length))。这会创建第二个int[]并将元素从原始元素复制到副本。 -
啊,好的,谢谢你,你救了我的一天
-
请注意,
Arrays.copyOf是一种方便。您可以简单地执行kw = new int[feld.length]; for (int i = 0; i < feld.length; i++) { kw[i] = feld[i]; }来创建副本。或kw = new int[feld.length]; System.arraycopy(feld, 0, copy, 0, feld.length);。另请注意,所有这些方法都只会创建数组的 shallow 副本。