一、关于三种方式的效率问题在此就不做过多的讨论了。
toString()>String.valueOf()>""。在执行效率上toSting()是最快的。
二、关于“”和null能使用哪种方式进行转换字符串及转换后是什么
1.首先来看“”的转换
public static void main(String[] args) {
System.out.println("".toString());
System.out.println(String.valueOf(""));
System.out.println(""+"");
}
我们可以看到控制台上什么都都没有输出,也没有报错,证明如果获取到的字段是“”的话进行字符串转换可以使用任意一种方式都没有问题。
2.接下来是null的转换
public static void main(String[] args) {
System.out.println(null+"");
System.out.println(String.valueOf(null));
}
我们可以看到null没有toString()方法,并且String.valueOf会报错,但是如何我们换一种写法,如下
public static void main(String[] args) {
Object obj = null;
System.out.println(obj.toString());
}
我们可以看到tostring()会报空指针 ,但是valueof()却返回了null;
public static void main(String[] args) {
Object obj = null;
System.out.println(String.valueOf(obj));
}
这样就没一点问题,这是什么原因呢?
这里我们可以看一下valueOf()的源码,发现valueOf()方法重载了,如果直接使用String.valueOf(null),我们会发现进的是valueOf(char data[])的这个方法,所以会报错。
三、以mysql为例,从数据库中取到的参数如何转换
场景1:我们经常会遇到这种情况,A提供接口,B会将查询到的数据转成字符串加密后进行推送,当B推送过来的数据中的某个字段可能存在空的可能,这时候我们要将对象类型转成string进行操作。
1.传输过来的数据进行解密后,转成map,其中map中不存在key为ss的数据,我们发现使用tostring()方法时报错。
2.往mysql中插入一条数据,如果某个字段不插值则默认为(NULL)。那么我们查询出来的字段时什么?我们可以看到取出来的值是null。如果我们直接给字段插入null,会发现mysql会将null默认写成(NULL)。下面是mysql的一条数据。
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()两个方法的比较,先看源码
isEmpty()当参数为null或“”的时候返回true,当参数为“ ”有空格的时候会返回false,或者参数为“null”的时候返回false;
isBlank()当参数为null或“”的时候返回true,我们发现内部有去空格的代码,因此参数为“ ”有空格的时候返回的也是true,但是同样参数为“null”的时候会返回false。