制作变量的副本并添加到Arraylist

时间:2012-03-30 11:44:32

标签: java arraylist

我正在使用应插入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”。

3 个答案:

答案 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

Good blog post explaining the difference

答案 1 :(得分:2)

最后,每个add都需要创建一个自己的对象。

使用克隆是一种方式。

或者在另一个中成对地添加值。

完全不同的方法是使用序列化。当您不想计算此值但记录它时,这是有意义的。在这种情况下,您需要一个outputStream

什么是最好的定义是你想用Object.movement

做什么

答案 2 :(得分:1)

您需要使用数组的clone()方法进行复制:

//for example
int[][] copy = (int[][])arraySource.clone();