AbstractCollection 抽象类,是Java util下的Collection的骨干类,提供了很多方法。很多方法,都被具体的实现类重写了,但是toString方法好像保留了,这个方法的源码如下:
public String toString() {
Iterator<E> i = iterator();
if (! i.hasNext())
return "[]";
StringBuilder sb = new StringBuilder();
sb.append('[');
for (;;) {
E e = i.next();
sb.append(e == this ? "(this Collection)" : e);
if (! i.hasNext())
return sb.append(']').toString();
sb.append(", ");
}
}
里面有一句
sb.append(e == this ? "(this Collection)" : e);
这句为啥要加这个判断呢,看下如下代码
ArrayList a = new ArrayList();
a.add("1");
a.add("2");
a.add(a);//加本身
System.out.println(a.toString());
a.add(a),这句本身没有语法错误的,虽然一般人不会这么加,但是真这样加了,上面那句判断不加,当前e是this的话,被append调用,又会调用自身的toString(),无线循环了,就会 overstackflow 了。jdk源码严谨值得学习啊。