事情并没有发生,因为我认为他们应该这样做,下面的代码是我正在做的事情。我创建一个arrayList然后添加一个整数数组。然后我将一个新构造的整数数组分配给我的arraylist的第一个元素。然后我改变构造的整数数组的值。我输出了arrayList元素和整数数组,它们是相同的值,不应该发生。
ArrayList<int[]> path = new ArrayList<int[]>();
int loc2[] = {0,0};
path.add(loc2);
int loc[];
loc = path.get(0);
loc[0] += 1;
System.out.println(loc[0]);
System.out.println(path.get(0)[0]);
两行代码的系统输出不应相同,但它是。
我做了一些严重错误的事情,或者我只是误解了我想要做的事情?
答案 0 :(得分:2)
通过引用更改它们。
您分配给loc
的内容只是loc2
的“地址”。
因此,无论您使用loc
进行了什么,都会发生loc2
,因为它们具有相同的“地址”。
您需要做的是使用基本循环deep copy
loc2
到loc
。例如:
public int[] copyArr(int[] arr) {
int length = arr.length;
int[] newArr = new int[length];
for (int i = 0; i < length; i++) {
newArr[i] = arr[i];
}
return newArr;
}
答案 1 :(得分:1)
您正在处理对相同实际的整数数组的引用。你有效地将'loc2'拉回来并将其分配给'loc'。
如果处理'loc2','loc'或使用path.get(0),它们与实际的整数数组相同,包含你制作'loc2'时的第一组值。
如果要获取副本并对其进行处理而不更改ArrayList中的原始数组。您需要创建一个新的Array对象,将值复制到您想要的对象中,然后使用它。
您可以查看使用System.arraycopy()。见Make copy of array Java