了解 Java 个数组

Understanding Java Arrays

请看下面的代码:

public static void main(String[] args) {
    Random random = new Random();
    int[] array = new int[10];
    Arrays.setAll(array, operand -> random.nextInt(10));
    System.out.println(Arrays.toString(array));
    swap(array, 0, 9);
    System.out.println(Arrays.toString(array));
}

static void swap(int[] array, int i, int j) {
    int temp = array[i]; // pass by value ??
    array[i] = array[j]; // the value of temp doesn't change, why?
    array[j] = temp; // temp == array[i]
}

方法 swap 中到底发生了什么?

我需要一个完整的解释和一个低水平。

编辑:

好的,让我再举一个例子:

public class StringHolder {

    private String value;

    public StringHolder(String value) {
        this.value = value;
    }

    public String getValue() {
        return value;
    }

    public void setValue(String value) {
        this.value = value;
    }

    @Override
    public String toString() {
        return getValue();
    }

}

主要方法:

public static void main(String[] args) {
    StringHolder[] holders = new StringHolder[]{new StringHolder("string 1")};
    StringHolder tmp = holders[0];
    holders[0].setValue("string 2");
    System.out.println(tmp);
    System.out.println(holders[0]);
}

输出:

string 2
string 2

根据@chokdee 的回答,tmp 是一个新变量并且有自己的内存...

但是当我们将更改应用于原始变量 (holder[0]) 时,它也会影响 tmp

另一个例子:

public static void main(String[] args) {
    StringHolder[] holders = new StringHolder[]{new StringHolder("string 1")};
    StringHolder tmp = holders[0];
    holders[0] = new StringHolder("string 2");
    System.out.println(tmp);
    System.out.println(holders[0]);
}

输出:

string 1
string 2

提前致谢。

数组中位置 i 的项目与位置 j 的项目交换。因此,在方法返回后,将在 array[j] 中找到以前称为 array[i] 的项。并且在方法返回后将在array[i]中找到以前称为array[j]的项目。

临时变量也用作交换space。

好的,尝试在低层次上进行解释。

int temp = array[i]; // storing the value in a new variable

array[i] = array[j]; // the value of temp wan't changes because this is a NEW variable and have it's own piece of memory (It's no a reference or pointer like in C)

array[j] = temp; // here the value inside the array is assigned with saved value in temp
int temp = array[i]; // pass by value ??

将位置 i 的元素复制到 temp

array[i] = array[j]; // the value of temp doesn't change, why?

将位置 j 的值复制到位置 itemp 不会改变,因为它是一个未在此语句中访问的变量。 tempcopy 而不是 array[i].

的别名
array[j] = temp; // temp == array[i]

将上一行赋值前在位置i的值复制到位置jtemp == array[i] 当且仅当 array[i] == array[j] 在方法的开头。

我会回答你的编辑问题。

public static void main(String[] args) {
    StringHolder[] holders = new StringHolder[]{new StringHolder("string 1")};
    StringHolder tmp = holders[0];
    holders[0].setValue("string 2");
    System.out.println(tmp); // string 2
    System.out.println(holders[0]); // string 2
}

因为两者都持有对同一对象的引用。


public static void main(String[] args) {
    StringHolder[] holders = new StringHolder[]{new StringHolder("string 1")};
    StringHolder tmp = holders[0];
    holders[0] = new StringHolder("string 2");
    System.out.println(tmp); // string 1
    System.out.println(holders[0]); // string 2
}

在这种情况下,引用由 tmp 持有。将新的 StringHolder 对象分配给 holders[0] 后,tmp 中的引用将变为实际对象。 通常,如果您没有 tmp,垃圾收集器会删除该对象。 最后你有两个个不同的StringHolder对象。