String的valueOf方法源码解读

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_30038111/article/details/81916473

valueOf 中的秘密

String中的valueOf方法大致可以分为三种:
String.valueOf(Object)、String.valueOf(char[])、String.valueOf(基本数据类型)
这里写图片描述

案例:

Integer arg = null;
String.valueOf(arg); // 输出 null
String.valueOf(null); // 抛java.lang.NullPointerException

为什么?
因为Java中所有类的顶级父类都是Object,从Java重载方法的执行这篇文章中我们知道,方法重载时,char[]数组优先于Object,因此null会调用String.valueOf(char[])方法。对于Integer arg = null;与数组类型不匹配,因此调用String.valueOf(Object)方法。

String.valueOf(Object)原码:

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

String.valueOf(char[])原码:

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

使用技巧

对象转成String类型,有三种方法:强转、.toString()、String.valueOf(Object)。

  • 强转
    只有类型匹配的才可以强转,例如Object obj = new Integer(10); String str = (String) obj;会抛CalssCastException异常
  • .toString()
    必须保证对象不为null,否则抛NullPointerException异常
  • String.valueOf(Object)
    方法实现避免了CalssCastExceptionNullPointerException,但是要注意,如果对象为null,那么返回的值是"null"字符串,而不是null。一定要注意这一点,在实际开发中,这个方法是比较常用的。

开发中的应用

例如两个人A和B对接接口,A发送一些数据给B,B去解析
A:

// 发送的数据为 Integer 类型
Object arg = new Integer(2);
// 发送给B的伪代码
send(arg);

B:

// 接收A参数的伪代码
Object arg = receive();
// B知道参数是一个数值类型的,但是B这边不知道A发的具体的类型
// Long rec = (Long) arg; 报错了,因为类型转换异常
// 使用 String.valueOf 可以避免
String rec = String.valueOf(arg);
if(!"null".equals(rec)){
    Long result = Long.valueOf(rec);
}

猜你喜欢

转载自blog.csdn.net/qq_30038111/article/details/81916473