到 while 循环内部。这样,数组将被重新分配,以便局部变量不会指向您之前添加到 arrayList 的同一个数组。
这是一个重现该问题的小测试程序:
import java.util.*;
public class DupeArr {
public void testBad() {
System.out.println("bad, multiple references to same array");
List<String[]> list = new ArrayList<String[]>();
String[] arr = {"a", "b"};
for (int i = 0; i < 2; i++) {
arr[0] = "" + i;
arr[1] = "" + (i * 10);
list.add(arr);
}
System.out.println(list.get(0)[0]);
System.out.println(list.get(0)[1]);
System.out.println(list.get(1)[0]);
System.out.println(list.get(1)[1]);
System.out.println(list.get(0)[0].equals(list.get(1)[0]));
System.out.println(list.get(0)[1].equals(list.get(1)[1]));
// printing true means these lists point to the same array
System.out.println("same reference=" + (list.get(0) == list.get(1)));
}
public void testGood() {
System.out.println("good, new array for each list item");
List<String[]> list = new ArrayList<String[]>();
for (int i = 0; i < 2; i++) {
String[] arr = {"a", "b"};
arr[0] = "" + i;
arr[1] = "" + (i * 10);
list.add(arr);
}
System.out.println(list.get(0)[0]);
System.out.println(list.get(0)[1]);
System.out.println(list.get(1)[0]);
System.out.println(list.get(1)[1]);
System.out.println(list.get(0)[0].equals(list.get(1)[0]));
System.out.println(list.get(0)[1].equals(list.get(1)[1]));
// printing false means these lists point to different arrays
System.out.println("same reference=" + (list.get(0) == list.get(1)));
}
public static void main(String[] args) {
DupeArr dupeArr = new DupeArr();
dupeArr.testBad();
dupeArr.testGood();
}
}
其输出是
bad, multiple references to same array
1
10
1
10
true
true
same reference=true
good, new array for each list item
0
0
1
10
false
false
same reference=false