java之深入理解toString()

来源:互联网 发布:优博瑞cos淘宝店铺 编辑:程序博客网 时间:2024/05/22 13:45

首先有这样一个问题:

 Map<Integer,String> map = new HashMap<Integer,String>();        map.put(1, "a");        map.put(2, "a");        map.put(3, "a");        System.out.println(map);
打印的结果是什么?

我想很多人都知道,结果是下面这样。

{1=a, 2=a, 3=a}

那么问题来了,为什么会是这个结果???


我们知道,在输出一个类的时候,如果没有重写父类的toString方法的话,打印的将会是Dog@987876,即:类名@hashcode,为什么是这个?让我们去Object里一看究竟:

public String toString() {        return getClass().getName() + "@" + Integer.toHexString(hashCode());    }
看到了吧,这就是问题的所在。所以只有子类重写父类的toString()方法之后,才会打印你想输出的信息。


但是我们并没有调toString()方法啊,它怎么会被打印出来那?让我们继续看System.out.println的源码:

public void println(Object x) {        String s = String.valueOf(x);        synchronized (this) {            print(s);            newLine();        }    }

没有啊!!!继续深入查找String.valueOf(),源码如下:

 public static String valueOf(Object obj) {        return (obj == null) ? "null" : obj.toString();    }

现在相信你就看懂了吧!哈哈

刚才说到的是类,那么对于集合是怎么打印的那?

map里是否也有toString()方法那?

答案是:并没有!!!

map集合是接口,HashMap是实现类,但是在HashMap之上还有个AbstractMap,这里面有个toString(),源码如下:

public String toString() {        Iterator<Entry<K,V>> i = entrySet().iterator();        if (! i.hasNext())            return "{}";        StringBuilder sb = new StringBuilder();        sb.append('{');        for (;;) {            Entry<K,V> e = i.next();            K key = e.getKey();            V value = e.getValue();            sb.append(key   == this ? "(this Map)" : key);            sb.append('=');            sb.append(value == this ? "(this Map)" : value);            if (! i.hasNext())                return sb.append('}').toString();            sb.append(',').append(' ');        }    }

现在你明白了为什么会出现上述的结果了吧。

而对于实现了list接口的集合而言,所有的实现类都会默认去打印抽象类AbstractCollection里。

原创粉丝点击