一、关于三种方式的效率问题在此就不做过多的讨论了。

toString()>String.valueOf()>""。在执行效率上toSting()是最快的。

二、关于“”和null能使用哪种方式进行转换字符串及转换后是什么

1.首先来看“”的转换

public static void main(String[] args) {
System.out.println("".toString());
System.out.println(String.valueOf(""));
System.out.println(""+"");
}


#yyds干货盘点#关于toString()、string.valueOf()、""三种转换字符串方式的比较_数据#yyds干货盘点#关于toString()、string.valueOf()、""三种转换字符串方式的比较_数据_02

我们可以看到控制台上什么都都没有输出,也没有报错,证明如果获取到的字段是“”的话进行字符串转换可以使用任意一种方式都没有问题。

2.接下来是null的转换

public static void main(String[] args) {

System.out.println(null+"");
System.out.println(String.valueOf(null));
}

#yyds干货盘点#关于toString()、string.valueOf()、""三种转换字符串方式的比较_空字符串_03

我们可以看到null没有toString()方法,并且String.valueOf会报错,但是如何我们换一种写法,如下

public static void main(String[] args) {
Object obj = null;
System.out.println(obj.toString());
}

#yyds干货盘点#关于toString()、string.valueOf()、""三种转换字符串方式的比较_mysql_04

我们可以看到tostring()会报空指针 ,但是valueof()却返回了null;

public static void main(String[] args) {
Object obj = null;
System.out.println(String.valueOf(obj));
}

#yyds干货盘点#关于toString()、string.valueOf()、""三种转换字符串方式的比较_mysql_05​ 这样就没一点问题,这是什么原因呢?

#yyds干货盘点#关于toString()、string.valueOf()、""三种转换字符串方式的比较_mysql_06

这里我们可以看一下valueOf()的源码,发现valueOf()方法重载了,如果直接使用String.valueOf(null),我们会发现进的是valueOf(char data[])的这个方法,所以会报错。

三、以mysql为例,从数据库中取到的参数如何转换

场景1:我们经常会遇到这种情况,A提供接口,B会将查询到的数据转成字符串加密后进行推送,当B推送过来的数据中的某个字段可能存在空的可能,这时候我们要将对象类型转成string进行操作。

1.传输过来的数据进行解密后,转成map,其中map中不存在key为ss的数据,我们发现使用tostring()方法时报错。

#yyds干货盘点#关于toString()、string.valueOf()、""三种转换字符串方式的比较_mysql_07

2.往mysql中插入一条数据,如果某个字段不插值则默认为(NULL)。那么我们查询出来的字段时什么?我们可以看到取出来的值是null。如果我们直接给字段插入null,会发现mysql会将null默认写成(NULL)。下面是mysql的一条数据。

#yyds干货盘点#关于toString()、string.valueOf()、""三种转换字符串方式的比较_mysql_08

#yyds干货盘点#关于toString()、string.valueOf()、""三种转换字符串方式的比较_空字符串_09

3.如果我们插入的是一个空字符串呢?如果是空字符串则取出来后仍然是空字符串。

通过以上分析,我们可以得出如下结论:

(1)“”转字符串的速度是最慢的,但是没任何问题,null可以转成字符串;

(2)toString()方式是最快的,但是将null转成字符串的时候会报空指针异常;

(3)String.valueOf()方式速度比toString()次之,同时转换null的时候不会报错,但是要注意将null赋值给以对象,然后再转换,如果直接传入null会报错,原因是null在重载的时候是不能重载给基础数据类型的,注意,这里的valueOf(char data[]),不是valueOf(char data),所以这里不是基础数据类型,是一个字符组。选择构造器的时候要选择最精确的一个,如何理解最精确呢?如果一个方法或构造器可以接受传递给另一个方法或构 造器的任何参数,那么我们就说第一个方法比第二个方法缺乏精确性。这里object显示是可以接收任何类型的参数的,显然没有char data[]精确,因此传入null会调用valueOf(char data[])。

四、org.apache.commons.lang的两个方法stringUtils.isEmpty()和stirngUtils.isblank()两个方法的比较,先看源码

#yyds干货盘点#关于toString()、string.valueOf()、""三种转换字符串方式的比较_数据_10

isEmpty()当参数为null或“”的时候返回true,当参数为“ ”有空格的时候会返回false,或者参数为“null”的时候返回false;

isBlank()当参数为null或“”的时候返回true,我们发现内部有去空格的代码,因此参数为“ ”有空格的时候返回的也是true,但是同样参数为“null”的时候会返回false。

#yyds干货盘点#关于toString()、string.valueOf()、""三种转换字符串方式的比较_字符串_11#yyds干货盘点#关于toString()、string.valueOf()、""三种转换字符串方式的比较_mysql_12#yyds干货盘点#关于toString()、string.valueOf()、""三种转换字符串方式的比较_数据_13#yyds干货盘点#关于toString()、string.valueOf()、""三种转换字符串方式的比较_空字符串_14#yyds干货盘点#关于toString()、string.valueOf()、""三种转换字符串方式的比较_字段_15#yyds干货盘点#关于toString()、string.valueOf()、""三种转换字符串方式的比较_数据_16#yyds干货盘点#关于toString()、string.valueOf()、""三种转换字符串方式的比较_字符串_17#yyds干货盘点#关于toString()、string.valueOf()、""三种转换字符串方式的比较_数据_18#yyds干货盘点#关于toString()、string.valueOf()、""三种转换字符串方式的比较_数据_19