了解 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
的值复制到位置 i
。 temp
不会改变,因为它是一个未在此语句中访问的变量。 temp
是 copy 而不是 array[i]
.
的别名
array[j] = temp; // temp == array[i]
将上一行赋值前在位置i
的值复制到位置j
。 temp == 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
对象。
请看下面的代码:
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
的值复制到位置 i
。 temp
不会改变,因为它是一个未在此语句中访问的变量。 temp
是 copy 而不是 array[i]
.
array[j] = temp; // temp == array[i]
将上一行赋值前在位置i
的值复制到位置j
。 temp == 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
对象。