爲什麼打印ArrayList對象輸出的不是地址呢?

爲什麼打印ArrayList對象輸出的不是地址呢?

爲什麼在打印一個ArrayList對象時,輸出的不是此對象的地址,而是該集合中的值?是如何實現的?

分析:

Object類是Java中其他所有類的基類,沒有ObjectJava面向對象無從談起,所有類都是Object類的直接子類或間接子類

而在Object類的toString()方法中,返回的是 getClass().getName() + "@" + Integer.toHexString(hashCode())也就是地址值,打印ArrayList對象沒有輸出地址值,便可知道ArrayList重寫了toString()方法.

查看源碼:

  1. 點擊ArrayList查看源碼,發現其中並沒有toString()方法,查看他的父類

  2. 在父類AbstractList中查找,依然沒有,在查看上一層父類

  3. 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對象

  • 判斷當前元素是否爲最後一位,是則添加右方括號,執行StringBuildertoString()方法並返回,

    不是則添加一個逗號一位空格,繼續下一層循環

差不多就是這樣了.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章