【问题标题】:Are variables not standalone, but just linking?变量不是独立的,而只是链接吗?
【发布时间】: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[] 对象。它被两个变量引用:feldkw。如果你想要一个副本,那么你需要复制数组(例如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 副本。

标签: java variables save


【解决方案1】:

等号=是Java中的Simple assignment operator,对于对象,它设置对对象的引用,进入变量,所以

feld -------> array
kw = feld     ^
kw -----------'

为了避免复制一个新对象

int[] feld = new int[]{1, 2, 3};
int[] kw = Arrays.copyOf(feld, feld.length);
int S1 = feld[0];
System.out.println(Arrays.toString(kw)); // [1, 2, 3]
int S2 = feld[1];
System.out.println(Arrays.toString(kw)); // [1, 2, 3]
feld[1] = S1;
System.out.println(Arrays.toString(kw)); // [1, 2, 3]
feld[0] = S2;
System.out.println(Arrays.toString(kw)); // [1, 2, 3]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-06-15
    • 1970-01-01
    • 2021-12-01
    • 2011-01-24
    • 2023-03-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多