以前一直以为转字符串用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呢?