println()为什么会输出hashCode
我们经常在使用println()时会莫名其妙的输出hashcode,譬如:
public class Test {
public static void main(String[] args) {
char[] arr1 = new char[]{'a', 'b', 'c'};
System.out.println(arr1);
System.out.println("前面加点东西就会:"+arr1);
}
}
- 输出结果:
abc
前面加点东西就会:[C@15db9742
我们可以清晰的看到:第二次输出前面加了字符串后会输出hashCode。
首先我们要知道,任何类都是继承自Object类,同时也都继承了Object类中的的toString()方法。下面我们先来看一下println()方法是怎么调用toString()方法的:
- println()的源码:
public void println(Object x) {
String s = String.valueOf(x);
synchronized (this) {
print(s);
newLine();
}
}
以上源码可以看出,println()接收的x对象传给了String.valueOf()这个方法。
2. String.valueOf()的源码:
public static String valueOf(Object obj) {
return (obj == null) ? "null" : obj.toString();
}
这里相当于调用obj.toString()这个方法。由于所有的java对象都派生自Object,如果没有对该方法做重写,则会调用父类的方法super.toString()。
3. toString()是如何发送hashCode的?
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
不难看出此处的toString方法会返回结果为classname + @ + hashcode
。
解决方法
很简单,重写toString()即可。下面举个栗子:
class Rewrite {
public String a;
public Rewrite(String a) {
this.a = a;
}
public String toString() {
return this.a;
}
}
public class Test {
public static void main(String[] args) {
Rewrite test = new Rewrite("abc");
System.out.println("试一下:"+ test);
}
}
输出结果: 试一下:abc
其实不难看出,重写toString()其实就是利用this让其返回正确的字符串。