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

Java 制作变量的副本并添加到Arraylist,java,arraylist,Java,Arraylist,我正在处理应该插入ArrayList的二维数组值。但这是在for循环中完成的,二维数组值的值在循环运行时会发生变化,因为它只是用作临时变量,这使得存储在ArrayList中的所有变量都会随着该变量的变化而发生变化。 因此,如果我尝试在循环完成时打印ArrayList的内容,那么所有的值都是相同的 for(int i = 0; i <= Counter; i++) { if(Xhavetomove >= i) arrayvalu

我正在处理应该插入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。

您需要使用数组的克隆方法进行复制:

//for example
int[][] copy = (int[][])arraySource.clone();
您需要使用阵列的克隆方法进行复制:

//for example
int[][] copy = (int[][])arraySource.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

问题在于将数组添加到对象的方式。您没有将数组添加到对象中。发生的情况是将地址添加到内存中阵列所在的位置。因此,每次将数组添加到对象时,每次都添加相同的地址。因此,对象中的每个数组实际上都是同一个数组,因为它们都指向内存中的一个位置。因此,当您更改数组时,它似乎会更改对象内部的所有数组

最好的方法是每次通过循环创建一个新的数组,实际上是在内存中创建一个新的位置让数组驻留,或者克隆将创建一个新引用的数组

例如:

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

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

使用克隆是一种方法

或始终以成对或其他方式添加值

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


什么是最好的取决于你想对对象做什么。移动

在最后,每个添加都需要创建一个自己的对象

使用克隆是一种方法

或始终以成对或其他方式添加值

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


什么是最好的由您想要对Object.movement执行的操作定义。您只更新单个数组值。我看不到ArrayList,除非你指的是你称之为add-on的东西。但是您总是添加相同的值,然后修改相同的值。我认为您混淆了和。您只更新单个数组值。我看不到ArrayList,除非你指的是你称之为add-on的东西。但是您总是添加相同的值,并修改相同的值。我认为您混淆了和。