我有一个
variables
。然而,当我更改 variables
时,arrayList 内的 int[] 也会更新。这里有什么问题吗?
import java.util.*;
public class test2 {
public static void main (String[] args) {
//adding an int[] to an int[] arrayList
ArrayList<int[]> arr = new ArrayList<>();
int[] variables = {10, 20};
arr.add(variables);
System.out.println(arr.get(0)[0] + " " + arr.get(0)[1]); // prints: 10 20
// changing the variables
variables[0] = 0;
variables[1] = 5;
// why does arr's int[] change?
System.out.println(arr.get(0)[0] + " " + arr.get(0)[1]); // prints: 0 5
}
}
我可以轻松地为
x = variables[0]
和 y = variables[1]
创建两个单独的变量,并使用 arr.add(new int[] {x, y})
将其添加到 arrayList,但是对于非常大的变量,情况不会如此。
int[] variables = {10, 20};
这会创建一个新对象(类似于从无到有地弹出宝藏,然后将其埋在广阔的海滩中),然后将一个引用分配给变量
variables
(variables
就像一张藏宝图;’为其指定一个引用’就像将地图擦拭干净,然后在地图上涂上埋藏的宝藏。
variables[0] = 5;
这是爪哇语:获取藏宝图
variables
。跟着它。往下挖。打开宝箱。取出您在该箱子内第一部分中找到的硬币并将其替换为“5”。
arr.add(variables);
这会将 参考(藏宝图)、不是对象(不是宝藏!)添加到
arr
。
这是不可能的。 Java 不是这样工作的。除了基元之外,一切都是参考。
数一下
new
(int[] v = {10, 20};
是 int[] v = new int[] {10, 20}
的语法糖。这就是你拥有的对象数量。
如果您想要一个包含 10 个独立 int 数组的数组列表,则需要 2 个独立的
new
。或者你拥有的只是藏宝图文件夹,每张地图都指向同一个宝藏。
数组实现
clone()
,如果你想要的话:
int[] data = {10, 20};
List<int[]> list = new ArrayList<int[]>();
for (int i = 0; i < 10; i++) list.add(data.clone());
list.get(0)[0] = 50;
System.out.println(list.get(1)[0]); // prints 10.
删除
clone()
,就会打印出 50。