Java 为什么在';对于';环

Java 为什么在';对于';环,java,arraylist,reference,Java,Arraylist,Reference,(事实证明,这里的代码是多余的,问题可以缩短,正如John Kugelamn的第一个答案所示。这都是关于创建对象的,而不是对它们的引用。) 我完全不知所措。看来for()循环已经疯了。或者只是我去 据我所知,它必须一步一步地完成某件事,但看起来所有的迭代都是同时进行的 代码如下: static ArrayList<float[][]> carCrd = new ArrayList<float[][]>(); String[] sarr = {"train", "\"tra

(事实证明,这里的代码是多余的,问题可以缩短,正如John Kugelamn的第一个答案所示。这都是关于创建对象的,而不是对它们的引用。)

我完全不知所措。看来for()循环已经疯了。或者只是我去

据我所知,它必须一步一步地完成某件事,但看起来所有的迭代都是同时进行的

代码如下:

static ArrayList<float[][]> carCrd = new ArrayList<float[][]>();
String[] sarr = {"train", "\"train::car_1::chassis\"",
  "\"train::car_2::chassis\"", "\"train::car_3::chassis\"",
  "\"train::car_4::chassis\"", "\"train::car_5::chassis\"" };

//function for parsing some big String into a list of
//phys. coordinates (loc and rot) for each model in sarr
ArrayList<float[][]> parse(. . .){
  float[] loc = {0, 0, 0};
  float[] rot = {0, 0, 0, 0};
  CoordTrack.carCrd.clear();
  carCrd.ensureCapacity(sarr.length);

  //for each String (model) in sarr parse corresp. coordinates:
  for(String par: sarr){
    sc = new Scanner(. . .);
    loc[0] = Float.valueOf(sc.next());
    . . .
    rot[3] = Float.valueOf(sc.next());
    sc.close();

    //let's print loc and rot for each iteration to see that they're 
    //correctly different:
    System.out.println("x: " + loc[0] + " y: " + loc[1] + " z: " + loc[2]);
    System.out.println("x: " + rot[0] + " y: " + rot[1] + " z: " +
      rot[2] + " w: " + rot[3]);

    //append the resulting List
    CoordTrack.carCrd.add(new float[][] { loc, rot });

    //now let's print the size of the list and it whole
    //in each 'for' iteration:
    System.out.print(carCrd.size());
    for(float[][] sar: carCrd){
      System.out.println("x: " + sar[0][0] + " y: " + sar[0][1] +
        " z: " + sar[0][2]);
      System.out.println("x: " + sar[1][0] + " y: " + sar[1][1] +
        " z: " + sar[1][2] + " w: " + sar[1][3]);
      System.out.print("");
  }

  }


return(carCrd);
}
正如我们所看到的,每次列表都不会被追加,而是被完全覆盖。 实际上,当我在for()中使用int index进行迭代时,当我使用数组而不是列表时,我得到了相同的结果。 为什么?

谁疯了

float[] loc = {0, 0, 0};
float[] rot = {0, 0, 0, 0};

...

CoordTrack.carCrd.add(new float[][] { loc, rot });
您一次又一次地添加相同的两个数组
loc
rot
newfloat[][]
不创建这些数组的副本,而是使用对它们的引用。
carCrd
中的每个条目都引用相同的两个数组


每次创建二维数组时,您都需要显式复制
浮点值。

为什么使用静态列表?您能发布一个我们可以自己编译和运行的列表吗?如果你能编辑出
并使其成为一个完整的、自包含的程序,那会有很大帮助。@JohnKugelman我想,从你下面的回答来看,有足够甚至多余的信息)此外,我使用Gazebo和我自己的环境设置来模拟动画,所以你几乎无法启动动画program@alexey,您可以使用
CoordTrack.carCrd.add(newfloat[][{loc.clone(),rot.clone()})
要将新数组添加到
列表中
@msandiford和JohnKugelman感谢您的快速回复,我稍后会检查它们,现在在Msk这里是凌晨3:30,这不是最好的时间。)我想我现在理解了这个问题。您知道Java中引用和副本的详细信息在哪里有更深入的解释吗?关于clone()方法的建议很有效,谢谢!
float[] loc = {0, 0, 0};
float[] rot = {0, 0, 0, 0};

...

CoordTrack.carCrd.add(new float[][] { loc, rot });