println()为什么会输出hashCode 及 解决方法

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()方法的:

  1. 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让其返回正确的字符串。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值