为什么列表或数组在 'for' 循环的每次迭代中完全被一个对象的副本填充?

Why is list or array filled completely with duplicates of one object in each iteration of 'for' loop?

(事实证明,这里的代码是多余的,问题可以更短一些,正如 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);
}

函数给出了这个输出:

x: 5.6086507 y: 96.49017 z: 4.2678218E-7
x: 7.454923E-7 y: -1.9659414E-7 z: -0.9956668 w: 0.092992336

1
x: 5.6086507 y: 96.49017 z: 4.2678218E-7
x: 7.454923E-7 y: -1.9659414E-7 z: -0.9956668 w: 0.092992336

x: 0.0 y: 0.0 z: 0.1
x: 0.0 y: 0.0 z: 0.0 w: 1.0

2
x: 0.0 y: 0.0 z: 0.1
x: 0.0 y: 0.0 z: 0.0 w: 1.0
x: 0.0 y: 0.0 z: 0.1
x: 0.0 y: 0.0 z: 0.0 w: 1.0

x: 0.13724202 y: -0.584103 z: 0.100000165
x: -5.220888E-7 y: -8.881327E-7 z: -0.062116615 w: 0.99806887

3
x: 0.13724202 y: -0.584103 z: 0.100000165
x: -5.220888E-7 y: -8.881327E-7 z: -0.062116615 w: 0.99806887
x: 0.13724202 y: -0.584103 z: 0.100000165
x: -5.220888E-7 y: -8.881327E-7 z: -0.062116615 w: 0.99806887
x: 0.13724202 y: -0.584103 z: 0.100000165
x: -5.220888E-7 y: -8.881327E-7 z: -0.062116615 w: 0.99806887

x: 0.16923165 y: -1.1832443 z: 0.10000184
x: -3.4203006E-7 y: -1.3052559E-6 z: 0.16753982 w: 0.9858653

4
x: 0.16923165 y: -1.1832443 z: 0.10000184
x: -3.4203006E-7 y: -1.3052559E-6 z: 0.16753982 w: 0.9858653
x: 0.16923165 y: -1.1832443 z: 0.10000184
x: -3.4203006E-7 y: -1.3052559E-6 z: 0.16753982 w: 0.9858653
x: 0.16923165 y: -1.1832443 z: 0.10000184
x: -3.4203006E-7 y: -1.3052559E-6 z: 0.16753982 w: 0.9858653
x: 0.16923165 y: -1.1832443 z: 0.10000184
x: -3.4203006E-7 y: -1.3052559E-6 z: 0.16753982 w: 0.9858653

x: 0.4568624 y: -1.7098008 z: 0.100002564
x: 3.1865994E-7 y: -2.2401466E-6 z: 0.48815113 w: 0.8727591

5
x: 0.4568624 y: -1.7098008 z: 0.100002564
x: 3.1865994E-7 y: -2.2401466E-6 z: 0.48815113 w: 0.8727591
x: 0.4568624 y: -1.7098008 z: 0.100002564
x: 3.1865994E-7 y: -2.2401466E-6 z: 0.48815113 w: 0.8727591
x: 0.4568624 y: -1.7098008 z: 0.100002564
x: 3.1865994E-7 y: -2.2401466E-6 z: 0.48815113 w: 0.8727591
x: 0.4568624 y: -1.7098008 z: 0.100002564
x: 3.1865994E-7 y: -2.2401466E-6 z: 0.48815113 w: 0.8727591
x: 0.4568624 y: -1.7098008 z: 0.100002564
x: 3.1865994E-7 y: -2.2401466E-6 z: 0.48815113 w: 0.8727591

x: 1.0100093 y: -1.9422312 z: 0.100003526
x: 3.6465533E-8 y: -1.9686745E-6 z: 0.7412199 w: 0.6712623

6
x: 1.0100093 y: -1.9422312 z: 0.100003526
x: 3.6465533E-8 y: -1.9686745E-6 z: 0.7412199 w: 0.6712623
x: 1.0100093 y: -1.9422312 z: 0.100003526
x: 3.6465533E-8 y: -1.9686745E-6 z: 0.7412199 w: 0.6712623
x: 1.0100093 y: -1.9422312 z: 0.100003526
x: 3.6465533E-8 y: -1.9686745E-6 z: 0.7412199 w: 0.6712623
x: 1.0100093 y: -1.9422312 z: 0.100003526
x: 3.6465533E-8 y: -1.9686745E-6 z: 0.7412199 w: 0.6712623
x: 1.0100093 y: -1.9422312 z: 0.100003526
x: 3.6465533E-8 y: -1.9686745E-6 z: 0.7412199 w: 0.6712623
x: 1.0100093 y: -1.9422312 z: 0.100003526
x: 3.6465533E-8 y: -1.9686745E-6 z: 0.7412199 w: 0.6712623

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

谁疯了?..

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

...

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

您一遍又一遍地添加相同的两个数组 locrotnew float[][] 不会创建这些数组的 copy,而是对它们使用 referencescarCrd 中的每个条目都引用相同的两个数组。

每次创建二维数组时都需要显式复制 float 值。