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里。
阅读全文
0 0
- java之深入理解toString()
- java HashCode之深入理解
- Java深入理解之异常
- Java深入理解之异常
- 深入理解Java之数据类型
- 深入理解Java之反射
- 深入理解Java之数据类型
- 深入理解Java之反射
- 深入java理解之注解
- 深入理解toString()和valueOf()函数
- Java集合之toString
- 深入理解 Java 虚拟机之走进Java
- 深入理解Java虚拟机之java内存
- 深入理解Java虚拟机之走近Java
- 深入理解Java虚拟机之走近Java
- object之toString方法深入剖析
- 《深入理解java虚拟机》之垃圾回收
- 深入理解Android之Java虚拟机Dalvik
- 视线跟踪学习总结
- MATLAB R2016A for mac 安装及破解教程
- CentOS 7.2安装Oracle数据库
- 跳舞
- 网页刷新或关闭事件
- java之深入理解toString()
- easyui datagrid 随 div不显示
- 云计算的初识
- web打印的几种方案
- ruby编程记录
- 习题4.1(3)
- @Override的作用
- 如何用数学课件制作工具画直角三角形
- kafka(4)--使用Streams处理数据