String.valueOf()是安全兜底的静态方法,可处理null并重载支持基本类型;toString()是对象自我表达的实例方法,null调用抛NPE,且无重载。

String.valueOf() 和 toString() 都能拿到字符串形式,但根本不是一回事——一个管“安全兜底”,一个管“自我表达”。
调用方式和归属不同
String.valueOf() 是 String 类的静态方法,直接通过类名调用,比如 String.valueOf(obj);它不依赖对象实例,甚至能处理 null。
toString() 是 Object 类定义的实例方法,所有对象都继承它,必须通过对象实例调用,比如 obj.toString();它本质是让对象自己描述自己,前提是 obj 不为 null。
null 处理方式截然相反
- String.valueOf(null) 返回字符串 "null"(四个字符),不会崩溃
- obj = null; obj.toString() 直接抛出 NullPointerException
这是最常踩坑的地方:日志拼接 "id=" + user 看似没调 valueOf,其实 JVM 底层自动用了它——所以 user 为 null 时输出的是 "id=null",而不是报错。
立即学习“Java免费学习笔记(深入)”;
适用对象和重载能力差异大
String.valueOf() 有大量重载版本,支持基本类型(int、boolean、char[] 等)直接转字符串,无需装箱或判空:
- String.valueOf(123) → "123"
- String.valueOf(true) → "true"
- String.valueOf(new char[]{'a','b'}) → "ab"
toString() 没有重载,只能在对象实例上调用。对基本类型不能直接用(如 123.toString() 编译不通过),必须先包装成 Integer 等对象。
底层逻辑其实有关联
String.valueOf(Object obj) 的源码很简单:
return (obj == null) ? "null" : obj.toString();
也就是说,它内部确实会调用 toString() —— 但只在 obj 不为 null 时。所以如果你重写了 toString(),String.valueOf() 也会体现你的定制逻辑;反之,若没重写,就用 Object 默认的 ClassName@hashCode 格式。


















