为什么打印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 
    * ("[]").  Adjacent elements are separated by the characters 
    * ", " (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()方法并返回,

    不是则添加一个逗号一位空格,继续下一层循环

差不多就是这样了.

你可能感兴趣的:(集合)