2017-02-26 126 views
-5
List subitemsCategory=new ArrayList(); //Creating the subList 
subitemsCategory.add("Garnier");  //Adding sublist 
subitemsCategory.add("Bajaj"); 
List items=new ArrayList();   //Creating Main List 
items.add("Shampoo"); 
items.add("Oil"); 
items.add(subitemsCategory);   //Adding a new List in items 
System.out.println(items);    //Print Collection within Collection 

集合中的集合是如何打印的?AbstractCollection的toString()如何在Java中的Collection中打印Collection?

+3

类型参数。你应该使用它们。 (这可能会帮助你理解你的问题。) –

+0

看看源代码:http://hg.openjdk.java.net/jdk8/jdk8/jdk/file/687fd7c7986d/src/share/classes/java/ UTIL/AbstractCollection.java#l453。它调用'append(e)',其中'e'是列表的一个元素,所以它基本上使用'e.toString()'。 – Andreas

+0

sb.append(e == this?“(this Collection)”:e); //这里的“这个集合”的目的是什么? –

回答

1

通过toString递归调用。
在Java中可以在每个对象上调用toString方法,而不管它是否为列表。

由3个串"a""b""c"的列表打印这种方式: [a, b, c]
[元素之前被印刷,
然后以逗号分隔的列表打印
并有在末端具有]

当一个元素本身是一个列表时会发生什么? 其toString方法执行,即:
[a, b, [c, d, e]]

你的情况:

[Shampoo, Oil, [Garnier, Bajaj]] 

继OP的另一个问题... 当我们这样做,会发生什么:

Collection aCollection = //constructor call 
aCollection.add(aCollection); 

有没有像堆栈溢出等错误 它会简单地打印:

[..., (this Collection), ...] 

这是三元运算符用法的目的in the source code

+0

sb.append(e == this?“(this Collection)”:e); //这里的“这个系列”的角色是什么? –

+0

@SunnyAgrawal,如果你这样做:在你的代码中'items.add(items)',你会看到;)它避免了对同一个集合的无限引用。 –