爲什麼打印ArrayList對象輸出的不是地址呢?
爲什麼在打印一個
ArrayList
對象時,輸出的不是此對象的地址,而是該集合中的值?是如何實現的?
分析:
Object
類是Java
中其他所有類的基類,沒有Object
類Java
面向對象無從談起,所有類都是Object
類的直接子類或間接子類
而在Object
類的toString()
方法中,返回的是 getClass().getName() + "@" + Integer.toHexString(hashCode())
也就是地址值,打印ArrayList
對象沒有輸出地址值,便可知道ArrayList
重寫了toString()
方法.
查看源碼:
-
點擊
ArrayList
查看源碼,發現其中並沒有toString()
方法,查看他的父類 -
在父類
AbstractList
中查找,依然沒有,在查看上一層父類 -
在
AbstractList
的父類AbstractCollection
查找,果然發現重寫了/** * Returns a string representation of this collection. The string * representation consists of a list of the collection's elements in the * order they are returned by its iterator, enclosed in square brackets * (<tt>"[]"</tt>). Adjacent elements are separated by the characters * <tt>", "</tt> (comma and space). Elements are converted to strings as * by {@link String#valueOf(Object)}. * * @return a string representation of this collection */ 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(' '); } }
doc註釋翻譯:
返回此集合的字符串表示形式。此字符串由集合的元素列表按順序組成,他們按他的迭代器返回.
用方括號括起來(“[]”)。相鄰的元素由字符分隔(逗號和空格)。元素被轉換爲字符串,
通過 {@link字符串#返回對象的值(對象)}。
分析源碼:
-
使用
Iterator
迭代器判斷集合中是否含有元素,沒有的話就只返回一對"[]" -
在循環外創建
StringBuilder
對象,先添加左方括號 -
循環集合,添加當前元素到
StringBuilder
對象 -
判斷當前元素是否爲最後一位,是則添加右方括號,執行
StringBuilder
的toString()
方法並返回,不是則添加一個逗號一位空格,繼續下一層循環
差不多就是這樣了.