为什么打印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()方法并返回,

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值