问题描述:
List<String> list=new ArrayList<String>();
("张三");
("李四");
("王五");
(());
结果输出:
[张三, 李四, 王五]
从结果我们会发现,不难发现,从第二个数据开始,每个数据的前面多了一个空格字符。
问题查找:
首先我们来看看ArrayList的定义:
public class ArrayList<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, Serializable
在我们ArrayList中我们并没有看到toString的具体实现。我们猜测,这个toString方法应该是从AbstractList类中继承而来的。而AbstractList中也并没有toString方法。
继续向上看AbstractList的定义:
public abstract class AbstractList<E> extends AbstractCollection<E> implements List<E>
我们在AbstractCollection类中,发现了toString方法。来看看AbstractCollection中的toString的实现:
public String toString() {
Iterator<E> it = iterator();
if (! ())
return "[]";
StringBuilder sb = new StringBuilder();
('[');
for (;;) {
E e = ();
(e == this ? "(this Collection)" : e);
if (! ())
return (']').toString();
(',').append(' ');
}
}
从代码中,我们确实可以看到,在toString方法中有一个.append(' ')来拼接了一个空格字符进去。所以我们在使用()方法的时候,出现了空格。
补充:
关于(e == this ? "(this Collection)" : e)
List<Object> list=new ArrayList<Object>();
("张三");
("李四");
("王五");
(list);
(());
假设我们将代码改成这样, 如果没有上面的判断语句会怎样?
那么我们的如果写入了这样上面的这样一段代码, 将会出现*Error的错误, 直接调用(e), 在循环到list的时候,还是会调用该toString()方法,导致无限循环.
我们可以来验证下我们的猜想
public class MyArrayList<E> extends ArrayList
{
@Override
public String toString()
{
Iterator<E> it = iterator();
if (! ())
return "[]";
StringBuilder sb = new StringBuilder();
('[');
for (;;) {
E e = ();
(e);
if (! ())
return (']').toString();
(',').append(' ');
}
}
}
调用上面的类自己单步试试吧!!!