1

我正在尝试使用字符串数组填充列表,但添加到列表中的唯一数组是最后添加的。这似乎被添加到所有列表元素中。

我究竟做错了什么?

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]
4

2 回答 2

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].

于 2013-02-14T09:17:26.900 回答
0

当您创建一个对象并将其添加到列表中时,该对象不会被复制到列表中。相反,现有对象的引用被添加到列表中。所以当您这样做时:

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) 也指向更新的数据。

为了添加新数组,您需要创建新数组并将其添加到列表中。

于 2013-02-14T09:22:43.350 回答