String.valueOf引发的血案

本文探讨了Java中String.valueOf()方法的使用误区,特别是当参数为null时的行为,以及重载方法的选择顺序可能导致的意外结果。建议开发者在处理null值时采取额外的预防措施。

1.String.valueOf(null) 会报错吗

感觉jdk做了容错处理不信你看源码

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

NPE报错
点进去报错的地方看看

public static String valueOf(char data[]) {
    return new String(data);
}
// 这里报错
public String(char value[]) {
    this.value = Arrays.copyOf(value, value.length);
}

2.String.valueOf(obj) (obj为null) 返回什么

应该是个null空对象
image
这货居然返回个"null"字符串 我去我要这玩意干啥子

上网找了找资料 stackoverflow蓝链

image

小结:

  • 是因为String.valueOf(char[] c)的方法要优先于String.valueOf(Object o) 因为char[] 更具体,所以优先选择,传入null也就进入这个方法了
  • 第二个返回"null"字符串是个暗坑,大家最好自己写个StringUtil去避免

这个问题也暴露出对基础知识重载优先顺序的盲区,是个java程序员都知道啥是重载,多个方法先后顺序也不一定每个人都清楚,后面将记录一篇文章 理清重载的顺序

### String.valueOf() 方法的用法 `String.valueOf()` 是 Java 中的一个静态方法,用于将不同类型的对象转换为字符串。它是一个非常通用且强大的工具,支持多种数据类型作为输入参数,并返回相应的字符串表示形式。以下是 `String.valueOf()` 的主要用法及其详细说明: #### 1. 基本语法 ```java public static String valueOf(Object obj) ``` 该方法可以接受以下几种类型的参数: - `Object`:任何对象。 - `char[]`:字符数组。 - `boolean`:布尔值。 - `char`:单个字符。 - `int`, `long`, `float`, `double`:基本数据类型。 #### 2. 示例代码 以下是一些常见的用法示例: ```java // 示例 1: 将整数转换为字符串 int number = 42; String strNumber = String.valueOf(number); // "42" [^6] // 示例 2: 将布尔值转换为字符串 boolean flag = true; String strFlag = String.valueOf(flag); // "true" [^6] // 示例 3: 将字符数组转换为字符串 char[] chars = {'H', 'e', 'l', 'l', 'o'}; String strChars = String.valueOf(chars); // "Hello" [^6] // 示例 4: 将浮点数转换为字符串 double pi = 3.14159; String strPi = String.valueOf(pi); // "3.14159" [^6] ``` #### 3. 特殊情况 当传入的对象为 `null` 时,`String.valueOf(null)` 不会抛出异常,而是返回字符串 `"null"`[^7]。 ```java Object nullObj = null; String strNull = String.valueOf(nullObj); // "null" [^7] ``` #### 4. 内部实现原理 `String.valueOf()` 方法的核心功能是调用其他相关方法来完成类型转换。例如: - 对于基本数据类型(如 `int`, `float`),它会调用对应的包装类方法(如 `Integer.toString()` 或 `Float.toString()`)[^8]。 - 对于对象类型,它会调用对象的 `toString()` 方法[^8]。 #### 5. 与 `new String()` 的区别 虽然 `String.valueOf()` 和 `new String()` 都可以用来创建字符串,但两者的使用场景有所不同: - 使用 `new String()` 会创建一个新的字符串对象,即使该字符串已经存在于字符串常量池中。 - 使用 `String.valueOf()` 则会优先从字符串常量池中查找已存在的字符串,从而提高性能和内存利用率[^9]。 ```java String s1 = new String("Java"); // 创建新的对象 String s2 = String.valueOf("Java"); // 可能复用常量池中的对象 System.out.println(s1 == s2); // false [^9] ``` #### 6. 性能考虑 在实际开发中,推荐使用 `String.valueOf()` 而不是 `new String()`,因为它更高效且符合最佳实践。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值