这就是头条三面?可能吗?

编码之外

共 2158字,需浏览 5分钟

 ·

2022-03-22 13:12

最近看到这样一个问题,说toString()、String.valueOf、(String)强转,有啥区别?重点是说,这是头条三面?

咱也不知道真的假的,那就分析分析这个问题吧!

直观分析

首先我们看这三头货,什么toString()、String.valueOf、(String)强转?有啥区别?就问你是不是很像,是不是都有一个String?

说白了,这三个都是将XX给变成String,简称变身String的方法

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

toString()

这个方法真正做到那种见名知意,也就是看到这个名字,我就知道它是干嘛的,所以平常咱们在命名的时候也要注意,你起的名字要有意义,看到这个名字我知道这个东西有什么用~

别一上去就整个:yydf

6e9342e35ec857e11f5a38ba34aa724b.webp

这啥玩意?你是要整个yyds,整个全世界最厉害的类,然后一不小心,手抖敲错字母了吗?

接着来看我们的toString,这玩意怎么用?

Integer a = 666;  
a.toString();

我们应该比较熟悉这种,就是在一些JavaBean中也就是我们的实体类或者pojo中:7fd3ebb55f562b394d5d7dec823a5f38.webp

这里的toString其实是重写了Objec类中的toString:

18a3beaef277805dc5fd0712c6edd724.webp

也即是说,如果你自己定义一个类,使用toString的话,那就是直接调用Objec类中的该方法了,但是一般我们都会重写该方法,比如integer这个包装类中:d6a59f49280c3005de184526a1e737f7.webp

发现这里的toString就与Objec中的不一样,进行了重写,我们可以这样使用:

Integer a = 666;  
String b = a.toString();

因为在Object中含有toString方法,又因为Object是所有类的父类,因此,所有的引用类型都可以使用toString方法,只不过大部分派生类都会重写该方法!

在Java中,数据分为基本数据类型和引用数据类型,而基本类型是无法使用toString方法的:

b459298595d63ad071fb949421705233.webp

不过在使用toString的时候我们要注意一下null值的问题:

e39ca9ec89292b400fa23ee130271876.webp

比如这样的情况,编译是没问题的,但是运行就报错了:

074acbbc98892c980cc437af5fc5b29d.webp

所以这里一定要注意,不然就掉坑了!

那对于toString这个方法,所有的引用类型都可以使用,大部分派生类会重写,使用要注意null问题,不然就会遇到空指针异常!

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

String.valueOf()

该方法属于String中的一个静态方法,使用起来相对来说会方便点,嗯,是这么回事:

f461eaf2e509245ad5070dec1bd572fe.webp

而且我们发现,对于基本类型,这个方法也是可以进行String的转变的,我们可以看下它的源码:

efeb87573838d183f35ce60ab996a814.webp

发现没有,当我们传入的是一个基本类型的时候,实际上最终还是调用的toString:

b5787c76315eebb8e6edbeb56b90c32b.webp

我们发现在String当中这是一个重载函数,而且其中一个可以传入Object作为参数,这说明啥?

也就意味着,啥玩意都可以往里面放,都可以帮助你转变成String,我们试下:

53c9862192a7fd4b5c984fa141dbd7a8.webp

输出结果:

a63e507a96e0845e2bc5031f123e85c8.webp

再看下null值问题:

7e673a1995099ff1288948d1983aa55e.webp

输出结果:

131890e4a0b42f796bdaaa53d6bd0d29.webp

发现没有,并没有给你报错,而是给你返回了一个字符串“null”,看源码:

977530813be2eb845dc18cf9b3ee2646.webp

原来这里是做了判空处理的,这个要比直接调用toString更加的安全了!

总结来说,就是String.valueOf()方法不仅可以用于引用类型,也可以用于基本类型(实际调用的是其包装类),不放实际上都是调用了toString方法,不过在以Object为参数的方法中增加了盼空处理,避免了空指针异常!

所以,一句话:

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

(String)强转

对于这种强转形式,大家应该对基本类型的强制转换比较熟悉,见的也比较多,其实吧,在基本类型中进行强制转换还可以……

但是吧,这个字符串强转真不咋地,也不怎么推荐使用,你看:

c8a712becb3c711456eb6b7bd82bd134.webp

表面来看,想基本类型和引用类型都是无法进行强转的,不过对于Object类型在编译的时候并没有什么问题,但是,这可不代表运行无错啊:

fa131dacc901ced7fc02dbefed6df301.webp

发现会报一个类型转换错误,也就是无法转换,不过对于null值问题:

8e80a792037648814db7d66dd5170b20.webp

发现这个对于null是可以强转的,一般在使用这个强转的时候,我们可以这样:

bf688913d365ab9c416df10e361d6b5e.webp

看下结果:

3a17a93c3037e93d89de6e71b285c9d8.webp

是不是更加友好,避免报错,所以在使用强转的时候,我们可以使用instanceof来进行类型检查,得到一个更加友好的提示!

不过,一般来说,还是不太推荐使用强转,就冲这名字,它就不太靠谱,你觉得呢?

+“”

这是啥呢?看:

13285465eecedf3944a67e10c7acb6ff.webp

运行也是没错的:

291edfbe68c0976a43eea12759d0b22c.webp

这种方式用过吗?

其实这种方式就相当于字符串直接拼接,对于这种形式我们可以反编译一个代码看看:

b98128535660a85e55b58f383d6ae445.webp


其实也就是先创建一个StringBuilder,然后通过append的方式拼接两个变量,最后在调用toString的方式!

对于这种方式,其实是不太建议的,因为它的效率不太行,也就是不建议直接拼接字符串的!

OK,如果你对字符串拼接比较感兴趣,可以私下自行研究下,今天的分享就到这里了!

可以说下,你都是使用哪种方式呢?

end


精品资源,超多福利加微信免费领取


长安添加下方·二维码

领取庆哥的编程自学秘籍PDF电子书),朋友圈每天更新

常驻小尾巴


往期精彩推荐

6a21f9d618faa5caaa234eb8c778e30a.webp

我已经不用 try catch 处理异常!太辣鸡了!


23c8e4dff5197393723c35563fa28dc8.webp

typora最佳替代品


fb68ece15cb42ba3d0323657f1182de4.webp

聊聊编程学习的方式,途径

浏览 20
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报