String.valueOf()转换空对象

文章讨论了在Java中使用String.valueOf()方法转换null对象时会返回null字符串,而使用强转(String)则会得到null。作者指出在判空操作中,null字符串会导致问题,并通过源码分析解释了valueOf()方法的行为。作者认为在某些情况下,直接调用对象的toString()可能更合适。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

以前一直以为转字符串用String.valueOf()非常优雅,是完爆(String) 这种强转方式的,直到今天遇到了一个坑才发现String.valueOf()并非我想的那么好用。
当我用String.valueOf()去转一个为null的对象时,会返回"null",如果用(String)的方式强转的话会得到一个null

HashMap<Object, Object> map = new HashMap<>();
Object o = map.get("123");
System.out.println("o = " + o); // o=null
String s1 = String.valueOf(o);
System.out.println("s1 = " + s1); // s1="null"
String s2 = (String) o;
System.out.println("s2 = " + s2); // null

显然我是希望得到一个null的而不是一个"null",因为在判空的时候我通常喜欢用StringUtils.isBlank(str),"null"不会被过滤掉
如果用String.valueOf()直接转null会报空指针

String s3 = String.valueOf(null); // 报空指针
System.out.println("s3 = " + s3);

其实看一下valueOf()的源码就能明白是为什么了

public static String valueOf(Object obj) {
    return (obj == null) ? "null" : obj.toString();
}

如果valueOf()转的是null就返回"null’,否则调用对象的toString(),所以感觉valueOf()好像没什么用,如果我需要.toString()我为什么不手动.toString呢?

Java中,`String.valueOf` 方法可以将其他数据类型转换为字符串。如果你想将转换后的字符串再转回原来的数据类型,可以使用相应的包装类或解析方法。以下是一些常见的转换方法: 1. **字符串转回基本数据类型**: - **整型**:`Integer.parseInt(String)` - **双精度浮点型**:`Double.parseDouble(String)` - **长整型**:`Long.parseLong(String)` - **布尔型**:`Boolean.parseBoolean(String)` 2. **字符串转回对象类型**: - **整型对象**:`Integer.valueOf(String)` - **双精度浮点型对象**:`Double.valueOf(String)` - **长整型对象**:`Long.valueOf(String)` - **布尔型对象**:`Boolean.valueOf(String)` 示例代码: ```java public class StringConversionExample { public static void main(String[] args) { // 原始数据类型 int originalInt = 123; double originalDouble = 45.67; long originalLong = 890L; boolean originalBoolean = true; // 使用 String.valueOf 转换为字符串 String intString = String.valueOf(originalInt); String doubleString = String.valueOf(originalDouble); String longString = String.valueOf(originalLong); String booleanString = String.valueOf(originalBoolean); // 将字符串转回原始数据类型 int convertedInt = Integer.parseInt(intString); double convertedDouble = Double.parseDouble(doubleString); long convertedLong = Long.parseLong(longString); boolean convertedBoolean = Boolean.parseBoolean(booleanString); // 输出结果 System.out.println("Converted int: " + convertedInt); System.out.println("Converted double: " + convertedDouble); System.out.println("Converted long: " + convertedLong); System.out.println("Converted boolean: " + convertedBoolean); // 字符串转回对象类型 Integer integerObject = Integer.valueOf(intString); Double doubleObject = Double.valueOf(doubleString); Long longObject = Long.valueOf(longString); Boolean booleanObject = Boolean.valueOf(booleanString); // 输出对象类型结果 System.out.println("Integer object: " + integerObject); System.out.println("Double object: " + doubleObject); System.out.println("Long object: " + longObject); System.out.println("Boolean object: " + booleanObject); } } ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值