java之深入理解toString(),深入理解tostring
分享于 点击 43413 次 点评:270
java之深入理解toString(),深入理解tostring
首先有这样一个问题:
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里。
相关文章
- 暂无相关文章
用户点评