我正在使用应插入ArrayList的二维数组值。但是这是在for循环中完成的,二维数组值的值随着循环的运行而变化,因为它只是用作临时变量(这使得存储在ArrayList中的所有变量都变为这个变量改变了)。 因此,如果我在循环完成时尝试打印出ArrayList的内容,则所有值都是相同的。
for(int i = 0; i <= Counter; i++)
{
if(Xhavetomove >= i)
arrayvalue[0][0] = this.Xspeed;
else
arrayvalue[0][0] = 0;
if(Yhavetomove >= i)
arrayvalue[0][1] = this.Xspeed;
else
arrayvalue[0][1] = 1;
System.out.println(arrayvalue[0][1]);
Object.movement.add(arrayvalue);
}
无论如何我可以让它存储价值本身吗?
例如:第一次循环运行时,该值为“5,5”,但如果我在循环完成时打印出ArrayList,则所有值都变为“5,1”。
答案 0 :(得分:2)
问题是在这里将Array添加到Object的方式。您没有将Array添加到Object。发生的事情是您将地址添加到阵列所在的内存中的位置。因此,每次将Array添加到Object时,每次都会添加相同的地址。因此,Object中的每个Array实际上都是相同的Array,因为它们都指向内存中的单个位置。因此,当您更改数组时,它似乎会更改对象内的所有数组。
要做的最好的事情是每次通过循环创建一个新数组,基本上在内存中为数组驻留创建一个新位置,或clone()
将创建新引用的数组。
示例:
String[] houseOfStark = {"Eddard", "Catelyn",
"Robb", "Sansa", "Arya", "Bran", "Rickon"}; // Sorry Jon
String[] copyOfStark = houseOfStark;
String[] cloneOfStark = houseOfStark.clone();
houseOfStark[1] = "Lady Catelyn";
System.out.println(houseOfStark[1]);
System.out.println(copyOfStark[1]);
System.out.println(cloneOfStark[1]);
将产生:
Lady Catelyn
Lady Catelyn
Catelyn
答案 1 :(得分:2)
最后,每个add都需要创建一个自己的对象。
使用克隆是一种方式。
或者在另一个中成对地添加值。
完全不同的方法是使用序列化。当您不想计算此值但记录它时,这是有意义的。在这种情况下,您需要一个outputStream
什么是最好的定义是你想用Object.movement
做什么答案 2 :(得分:1)
您需要使用数组的clone()
方法进行复制:
//for example
int[][] copy = (int[][])arraySource.clone();