toString()、String.valueOf、(String)强转,有啥区别?

@TOC
首先我们了解一下哎,什么toString()、String.valueOf、(String)强转?有啥区别?就问你是不是很像,是不是都有一个String?
说白了,这三个都是将XX给变成String,简称变身String的方法

接下来一个一个的分析下!

toString()

这个方法真正做到那种见名知意,也就是看到这个名字,我就知道它是干嘛的,所以平常咱们在命名的时候也要注意,你起的名字要有意义,看到这个名字我知道这个东西有什么用~
接着来看我们的toString,这玩意怎么用?
Integer a = 666;
a.toString();
我们应该比较熟悉这种,就是在一些JavaBean中也就是我们的实体类或者pojo中:
toString()、String.valueOf、(String)强转,有啥区别?_第1张图片
这里的toString其实是重写了Objec类中的toString:
![在这里插入图片描述](https://img-blog.csdnimg.cn/147a7e5a4a254a268f599642fdf904cf.png
也即是说,如果你自己定义一个类,使用toString的话,那就是直接调用Objec类中的该方法了,但是一般我们都会重写该方法,比如integer这个包装类中:
toString()、String.valueOf、(String)强转,有啥区别?_第2张图片
发现这里的toString就与Objec中的不一样,进行了重写,我们可以这样使用:
Integer a = 666;
String b = a.toString();
因为在Object中含有toString方法,又因为Object是所有类的父类,因此,所有的引用类型都可以使用toString方法,只不过大部分派生类都会重写该方法!
在Java中,数据分为基本数据类型和引用数据类型,而基本类型是无法使用toString方法的:
toString()、String.valueOf、(String)强转,有啥区别?_第3张图片
不过在使用toString的时候我们要注意一下null值的问题:
toString()、String.valueOf、(String)强转,有啥区别?_第4张图片
比如这样的情况,编译是没问题的,但是运行就报错了:
toString()、String.valueOf、(String)强转,有啥区别?_第5张图片
所以这里一定要注意,不然就掉坑了!
那对于toString这个方法,所有的引用类型都可以使用,大部分派生类会重写,使用要注意null问题,不然就会遇到空指针异常!

鉴于大部分人都是不认真的,所以一般就不推荐使用该方法了,但是如果有些情况使用toString性价比更高的话,那就用呗,做人,不能太死板了!

String.valueOf()

该方法属于String中的一个静态方法,使用起来相对来说会方便点,嗯,是这么回事:
toString()、String.valueOf、(String)强转,有啥区别?_第6张图片
而且我们发现,对于基本类型,这个方法也是可以进行String的转变的,我们可以看下它的源码:
toString()、String.valueOf、(String)强转,有啥区别?_第7张图片
发现没有,当我们传入的是一个基本类型的时候,实际上最终还是调用的toString:
toString()、String.valueOf、(String)强转,有啥区别?_第8张图片
我们发现在String当中这是一个重载函数,而且其中一个可以传入Object作为参数,这说明啥?
也就意味着,啥玩意都可以往里面放,都可以帮助你转变成String,我们试下:
toString()、String.valueOf、(String)强转,有啥区别?_第9张图片
输出结果:
toString()、String.valueOf、(String)强转,有啥区别?_第10张图片
再看下null值问题:
toString()、String.valueOf、(String)强转,有啥区别?_第11张图片
输出结果:
toString()、String.valueOf、(String)强转,有啥区别?_第12张图片
发现没有,并没有给你报错,而是给你返回了一个字符串“null”,看源码:
toString()、String.valueOf、(String)强转,有啥区别?_第13张图片
原来这里是做了判空处理的,这个要比直接调用toString更加的安全了!
总结来说,就是String.valueOf()方法不仅可以用于引用类型,也可以用于基本类型(实际调用的是其包装类),不放实际上都是调用了toString方法,不过在以Object为参数的方法中增加了盼空处理,避免了空指针异常!
所以,一句话:

String.valueOf()方法比toString()方法好用,推荐

(String)强转

对于这种强转形式,大家应该对基本类型的强制转换比较熟悉,见的也比较多,其实吧,在基本类型中进行强制转换还可以……
但是吧,这个字符串强转真不咋地,也不怎么推荐使用,你看:
toString()、String.valueOf、(String)强转,有啥区别?_第14张图片
表面来看,想基本类型和引用类型都是无法进行强转的,不过对于Object类型在编译的时候并没有什么问题,但是,这可不代表运行无错啊:
在这里插入图片描述
发现会报一个类型转换错误,也就是无法转换,不过对于null值问题:
toString()、String.valueOf、(String)强转,有啥区别?_第15张图片
发现这个对于null是可以强转的,一般在使用这个强转的时候,我们可以这样:
toString()、String.valueOf、(String)强转,有啥区别?_第16张图片
看下结果:
toString()、String.valueOf、(String)强转,有啥区别?_第17张图片
是不是更加友好,避免报错,所以在使用强转的时候,我们可以使用instanceof来进行类型检查,得到一个更加友好的提示!
不过,一般来说,还是不太推荐使用强转,就冲这名字,它就不太靠谱,你觉得呢?
toString()、String.valueOf、(String)强转,有啥区别?_第18张图片
运行也是没错的:
toString()、String.valueOf、(String)强转,有啥区别?_第19张图片
这种方式用过吗?
其实这种方式就相当于字符串直接拼接,对于这种形式我们可以反编译一个代码看看:
toString()、String.valueOf、(String)强转,有啥区别?_第20张图片
其实也就是先创建一个StringBuilder,然后通过append的方式拼接两个变量,最后在调用toString的方式!
对于这种方式,其实是不太建议的,因为它的效率不太行,也就是不建议直接拼接字符串的!

你可能感兴趣的:(Java专栏,java)