【发布时间】:2013-09-14 09:09:31
【问题描述】:
我有一个 IntArray A。
int[] A={1,2,3};
然后我把它复制到 B。
int[] B=A;
现在我想更改 A 中的元素;
A[1]=B[2];
我希望 A 现在变成 {1,3,3},而 B 保持相同的 {1,2,3}。
为什么B改成[1,3,3]?
【问题讨论】:
我有一个 IntArray A。
int[] A={1,2,3};
然后我把它复制到 B。
int[] B=A;
现在我想更改 A 中的元素;
A[1]=B[2];
我希望 A 现在变成 {1,3,3},而 B 保持相同的 {1,2,3}。
为什么B改成[1,3,3]?
【问题讨论】:
它们都是不是单独的数组。
你写的
int[] B=A;
因为有指向同一个数组。
如果您自动更改 A,B 更改。
如果您想让B 成为常量,请以B 的名义创建一个新数组。
int[] B = new int[3];
正如您与通过引用和值传递混淆:Is Java "pass-by-reference" or "pass-by-value"?
【讨论】:
因为您没有复制数组,所以使用引用很简单。
这意味着,如果您创建一个数组,您就是在为该变量分配一块内存。
int[] array ----------------> PieceOfMemory
如果你像以前一样“复制”数组,你只是告诉另一个变量指向同一块内存
int[] array ----------------> PieceOfMemory <----------------- int[] secondArray
在这种情况下,如果您更改“PieceOfMemory”,则很明显您正在更改两个变量。
如果你想复制数组,你必须这样做:
int[] firstArray = {1,2,3};
int[] secondArray = new int[3];
secondArray = (int[]) clone(firstArray);
现在发生的事情是这样的:
int[] firstArray ---------------------> firstPieceOfMemory
int[] secondArray --------------------> secondPieceOfMemory
但是值被复制了。
【讨论】:
secondArray = (int[]) clone(firstArray); 你是说secondArray = firstArray.clone(); 吗?
当你这样做时
int[] B=A;
B 和A 都指向相同的后备数组。 B 和 A 这里只是 references 指向同一个底层数组。
A ----->[1,2,3]
^
B----------|
要制作新副本,您可以使用Arrays#copyOf 或手动创建新数组并逐个复制字段。
【讨论】:
您需要了解对象和引用之间的区别。
即B=A;不是制作数据的副本,而是对数据的引用的副本。
【讨论】:
因为 B 不是一个新数组,它只是 A 所引用的数组的另一个名称。
【讨论】:
是的 B 也更改为 {1,3,3} 因为 A 和 B 只是引用存储数组的实际内存对于两个数组来说都是相同的,所以两个数组都包含相同的值。
【讨论】: