我有一个 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];
正如您对按引用传递和值传递感到困惑的那样:Java 是“按引用传递”还是“按值传递”?
因为您没有复制数组,所以使用引用很简单。
这意味着,如果您创建一个数组,您就是在为该变量分配一块内存。
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
但是值被复制。
当你这样做
int[] B=A;
B
并且A
都指向同一个后备数组。B
这里A
只是指向相同底层数组的引用。
A ----->[1,2,3]
^
B----------|
要制作新副本,您可以使用Arrays#copyOf或手动创建一个新数组并逐个复制字段。
您需要了解对象和引用之间的区别。
即B=A;
不复制数据,而是复制对数据的引用。
因为 B 不是一个新数组,它只是 A 引用的数组的另一个名称。
是的 B 也更改为 {1,3,3} 因为 A 和 B 只是引用存储数组的实际内存对于两个数组来说都是相同的,所以两个数组都包含相同的值。