我正在尝试使用字符串数组填充列表,但添加到列表中的唯一数组是最后添加的数组。这似乎被添加到所有列表元素中。
我做错了什么?
String[] indata = new String[2];
List<String[]> ls = new ArrayList<String[]>();
indata[0]="test1";
indata[1]="test2";
ls.add(indata);
indata[0]="test3";
indata[1]="test4";
ls.add(indata);
for(int index=0; index < ls.size(); index++)
System.out.println("ZZZZZZZZZZZZ----->> " + index + " " + Arrays.toString(ls.get(index)));
预期产出:
ZZZZZZZZZZZZ----->> 0 [test1, test2]
ZZZZZZZZZZZZ----->> 1 [test3, test4]
实际输出:
ZZZZZZZZZZZZ----->> 0 [test3, test4]
ZZZZZZZZZZZZ----->> 1 [test3, test4]
答案 0 :(得分:3)
应该是:
String [] indata = new String [2];
List <String []> ls = new ArrayList <String []> ();
indata [0] = "test1";
indata [1] = "test2";
ls.add (indata);
indata = new String [2]; // This line added
indata [0] = "test3";
indata [1] = "test4";
ls.add (indata);
执行ls.add (indata)
时,对数组的引用存储在列表中,但不存储在数组的副本中。因此,在此之后,ls.get (0)
和indata
指向同一个数组实例,并使用indata [0] = "test3"
修改此数组的第一个元素将改变您使用ls.get (0)[0]
看到的内容。
答案 1 :(得分:0)
当你创建一个对象并将它添加到一个列表中时,该对象不会被复制到list.Instead现有对象的引用被添加到list.So当你这样做时:
String[] indata = new String[2];
List<String[]> ls = new ArrayList<String[]>();
indata[0]="test1";
indata[1]="test2";
ls.add(indata);
indata和ls.get(0)都指向同一个对象。
这里你再次修改indata指向的数据以添加第二个数组。所以ls.get(0)也指向更新的数据。
为了添加新数组,您需要创建新数组并将其添加到列表中。