集合中的toString()
先看一段代碼:
public static void main(String[] args) {
//創建Collection對象,由於Collection是一個接口,所以是不能夠實例化的,所以能夠使用其子類對象
Collection c = new ArrayList();
c.add("hello");
c.add("world");
c.add("java");
System.out.println(c);
}
//輸出結果:[hello, world, java]
由上可見,輸出的是一個拼接好的字符串,而不是地址值,為什么呢?
首先:Collection c = new ArrayList();這是一個多態的體現,輸出的c其實是
ArrayList的toString()方法。
那么,我們應該找ArrayList中的方法,那么我們在ArrayList中去查找相關的toString()方法,看是否有該方法,但是沒有找到。
跟進查找,我們去ArrayList的父類中去查找,之后再晚上找,在AbstractCollection中找到相關源碼:
public String toString() {
//調用迭代器,獲取元素
Iterator<E> it = iterator();
if (! it.hasNext())
return "[]";
StringBuilder sb = new StringBuilder();
sb.append('[');
//無條件死循環
for (;;) {
E e = it.next();
sb.append(e == this ? "(this Collection)" : e);
if (! it.hasNext())
return sb.append(']').toString();
sb.append(',').append(' ');
}
}
//由上述代碼可見,其實toString就是遍歷元素並拼接"[",和"]".並返回拼接結果。