优先用 String.valueOf(),因其是静态方法且内置空值判断,传入 null 返回字符串"null";而 toString() 是实例方法,对象为 null 时会抛 NPE。

直接说结论:优先用 String.valueOf(),除非你明确知道对象非 null 且需要定制化字符串表现形式,才考虑重写或调用 toString()。
核心区别一句话
toString() 是实例方法,必须对象不为 null 才能安全调用;String.valueOf() 是静态方法,内部自带空值判断,传入 null 会返回字符串 "null",不会抛异常。
什么时候必须用 String.valueOf()
- 处理可能为
null的对象(比如数据库查询结果、接口返回值、Map.get() 值) - 统一转换各种类型——它有多个重载:
valueOf(int)、valueOf(boolean)、valueOf(Object)等,无需记忆包装类的 toString 方法 - 日志打印、拼接字符串、JSON 序列化前的预处理等“防御性编码”场景
- 避免在业务逻辑中频繁写
obj != null ? obj.toString() : "null"这类样板代码
toString() 适合什么情况
- 你在自定义类中重写了
toString(),用于调试或展示有意义的信息(如User{id=123, name="张三"}) - 确定对象一定不为
null,且想直接使用该类语义化的字符串表示(比如LocalDateTime.now().toString()) - 性能极端敏感的内循环中(但差异微乎其微,通常不构成理由)
特别注意的坑
-
String.valueOf(null)会抛NullPointerException——这不是 bug,是因为编译器选择了valueOf(char[])重载,而该重载未对数组做 null 判断。正确做法是确保传入的是Object类型,例如:String.valueOf((Object) null)或更稳妥地让变量本身是 Object 类型引用 -
toString()对基本类型不可用(int i = 5; i.toString()编译失败),必须用包装类或String.valueOf(i) -
(String) obj不是字符串转换方法,而是类型强转,仅当obj实际是String或其子类时才安全,否则运行时报ClassCastException
日常开发中,把 String.valueOf(x) 当作默认选择,既安全又简洁。只有当你在写工具类、框架代码,或明确控制对象生命周期并需语义化输出时,才主动调用 toString()。


















