JAVA,列表清单

时间:2013-10-26 10:52:33

标签: java list arraylist

我有列表和列表列表:

ArrayList<String> singleList = new ArrayList<String>();
ArrayList<ArrayList<String>> listOfLists = new ArrayList<ArrayList<String>>();

我不明白这些列表的行为。我决定给你一个简单的例子:

listOfLists.clear();

singleList.clear();
singleList.add("A");
singleList.add("B");
singleList.add("C");
listOfLists.add(singleList);

singleList.clear();
singleList.add("D");
singleList.add("E");
singleList.add("F");
listOfLists.add(singleList);

singleList.clear();
singleList.add("G");
singleList.add("H");
singleList.add("I");
listOfLists.add(singleList);

for(int x = 0; x < listOfLists.size(); x++)
{
    for(int z = 0; z < singleList.size(); z++)
        {
        System.out.print(listOfLists.get(x).get(z));
        System.out.print(" ");
    }
    System.out.println("");
}

我得到的结果是:

G H I G H我 G H I

相反:

A B C. D E F. G H I

我的想法出在哪里?如何获得上述结果?

3 个答案:

答案 0 :(得分:14)

对象始终作为Java中的引用传递。

当您将singleList添加到listOfLists时,您实际上是将引用添加到singleList。由于您已经添加了3次,因此您获得了singleList的当前值,重复了3次。

singleList“之前的值”无处存储,因此A B CD E F会丢失。

您需要使用new ArrayList<String>(singleList)制作列表的副本。然后,将此副本添加到listOfLists

答案 1 :(得分:4)

问题是对象引用是如何工作的。一步一步走

singleList.clear();
singleList.add("A");
singleList.add("B");
singleList.add("C");
listOfLists.add(singleList);

//singleList -> A, B, C 
//listOfLists -> singleList

singleList.clear();
singleList.add("D");
singleList.add("E");
singleList.add("F");
listOfLists.add(singleList);

//singleList -> D, E, F
//listOfLists -> singleList, singleList

singleList.clear();
singleList.add("G");
singleList.add("H");
singleList.add("I");
listOfLists.add(singleList);

//singleList -> G, H, I
//listOfLists -> singleList, singleList, singleList

现在,您正在打印listOfLists,它包含3次singleList。但是singleList现在包含G,H,I

要获得所需的结果,您需要使用不同的列表,一个包含A,B,C,另一个包含D,E,F,另一个包含G,H,I。

singleList1 -> A, B, C
singleList2 -> D, E, F
singleList3 -> F, G, H
listOfLists -> singleList1, singleList2, singleList3

答案 2 :(得分:0)

要制作列表列表,您可以轻松使用ArrayList<ArrayList<Integer>> listOfLists = new ArrayList<ArrayList<Integer>>;制作整数列表列表,或将Integer替换为String或任何您想要的内容。要访问项目,请使用listOfLists.get(0).get(0)来获取listOfLists内第一个列表的第一项。不确定这是否有帮助。