這就是頭條三面?可能嗎?
最近看到這樣一個(gè)問題,說toString()、String.valueOf、(String)強(qiáng)轉(zhuǎn),有啥區(qū)別?重點(diǎn)是說,這是頭條三面?
咱也不知道真的假的,那就分析分析這個(gè)問題吧!
直觀分析首先我們看這三頭貨,什么toString()、String.valueOf、(String)強(qiáng)轉(zhuǎn)?有啥區(qū)別?就問你是不是很像,是不是都有一個(gè)String?
說白了,這三個(gè)都是將XX給變成String,簡(jiǎn)稱變身String的方法
接下來一個(gè)一個(gè)的分析下!
toString()
這個(gè)方法真正做到那種見名知意,也就是看到這個(gè)名字,我就知道它是干嘛的,所以平常咱們?cè)诿臅r(shí)候也要注意,你起的名字要有意義,看到這個(gè)名字我知道這個(gè)東西有什么用~
別一上去就整個(gè):yydf

這啥玩意?你是要整個(gè)yyds,整個(gè)全世界最厲害的類,然后一不小心,手抖敲錯(cuò)字母了嗎?
接著來看我們的toString,這玩意怎么用?
Integer?a?=?666;??
a.toString();
我們應(yīng)該比較熟悉這種,就是在一些JavaBean中也就是我們的實(shí)體類或者pojo中:
這里的toString其實(shí)是重寫了Objec類中的toString:

也即是說,如果你自己定義一個(gè)類,使用toString的話,那就是直接調(diào)用Objec類中的該方法了,但是一般我們都會(huì)重寫該方法,比如integer這個(gè)包裝類中:
發(fā)現(xiàn)這里的toString就與Objec中的不一樣,進(jìn)行了重寫,我們可以這樣使用:
Integer?a?=?666;??
String?b?=?a.toString();
因?yàn)樵贠bject中含有toString方法,又因?yàn)镺bject是所有類的父類,因此,所有的引用類型都可以使用toString方法,只不過大部分派生類都會(huì)重寫該方法!
在Java中,數(shù)據(jù)分為基本數(shù)據(jù)類型和引用數(shù)據(jù)類型,而基本類型是無法使用toString方法的:

不過在使用toString的時(shí)候我們要注意一下null值的問題:

比如這樣的情況,編譯是沒問題的,但是運(yùn)行就報(bào)錯(cuò)了:

所以這里一定要注意,不然就掉坑了!
那對(duì)于toString這個(gè)方法,所有的引用類型都可以使用,大部分派生類會(huì)重寫,使用要注意null問題,不然就會(huì)遇到空指針異常!
鑒于大部分人都是不認(rèn)真的,所以一般就不推薦使用該方法了,但是如果有些情況使用toString性價(jià)比更高的話,那就用唄,做人,不能太死板了!
String.valueOf()
該方法屬于String中的一個(gè)靜態(tài)方法,使用起來相對(duì)來說會(huì)方便點(diǎn),嗯,是這么回事:

而且我們發(fā)現(xiàn),對(duì)于基本類型,這個(gè)方法也是可以進(jìn)行String的轉(zhuǎn)變的,我們可以看下它的源碼:

發(fā)現(xiàn)沒有,當(dāng)我們傳入的是一個(gè)基本類型的時(shí)候,實(shí)際上最終還是調(diào)用的toString:

我們發(fā)現(xiàn)在String當(dāng)中這是一個(gè)重載函數(shù),而且其中一個(gè)可以傳入Object作為參數(shù),這說明啥?
也就意味著,啥玩意都可以往里面放,都可以幫助你轉(zhuǎn)變成String,我們?cè)囅拢?/p>
輸出結(jié)果:

再看下null值問題:

輸出結(jié)果:

發(fā)現(xiàn)沒有,并沒有給你報(bào)錯(cuò),而是給你返回了一個(gè)字符串“null”,看源碼:

原來這里是做了判空處理的,這個(gè)要比直接調(diào)用toString更加的安全了!
總結(jié)來說,就是String.valueOf()方法不僅可以用于引用類型,也可以用于基本類型(實(shí)際調(diào)用的是其包裝類),不放實(shí)際上都是調(diào)用了toString方法,不過在以O(shè)bject為參數(shù)的方法中增加了盼空處理,避免了空指針異常!
所以,一句話:
String.valueOf()方法比toString()方法好用,推薦
(String)強(qiáng)轉(zhuǎn)
對(duì)于這種強(qiáng)轉(zhuǎn)形式,大家應(yīng)該對(duì)基本類型的強(qiáng)制轉(zhuǎn)換比較熟悉,見的也比較多,其實(shí)吧,在基本類型中進(jìn)行強(qiáng)制轉(zhuǎn)換還可以……
但是吧,這個(gè)字符串強(qiáng)轉(zhuǎn)真不咋地,也不怎么推薦使用,你看:

表面來看,想基本類型和引用類型都是無法進(jìn)行強(qiáng)轉(zhuǎn)的,不過對(duì)于Object類型在編譯的時(shí)候并沒有什么問題,但是,這可不代表運(yùn)行無錯(cuò)啊:

發(fā)現(xiàn)會(huì)報(bào)一個(gè)類型轉(zhuǎn)換錯(cuò)誤,也就是無法轉(zhuǎn)換,不過對(duì)于null值問題:

發(fā)現(xiàn)這個(gè)對(duì)于null是可以強(qiáng)轉(zhuǎn)的,一般在使用這個(gè)強(qiáng)轉(zhuǎn)的時(shí)候,我們可以這樣:

看下結(jié)果:

是不是更加友好,避免報(bào)錯(cuò),所以在使用強(qiáng)轉(zhuǎn)的時(shí)候,我們可以使用instanceof來進(jìn)行類型檢查,得到一個(gè)更加友好的提示!
不過,一般來說,還是不太推薦使用強(qiáng)轉(zhuǎn),就沖這名字,它就不太靠譜,你覺得呢?
+“”
這是啥呢?看:

運(yùn)行也是沒錯(cuò)的:

這種方式用過嗎?
其實(shí)這種方式就相當(dāng)于字符串直接拼接,對(duì)于這種形式我們可以反編譯一個(gè)代碼看看:

其實(shí)也就是先創(chuàng)建一個(gè)StringBuilder,然后通過append的方式拼接兩個(gè)變量,最后在調(diào)用toString的方式!
對(duì)于這種方式,其實(shí)是不太建議的,因?yàn)樗男什惶校簿褪遣唤ㄗh直接拼接字符串的!
OK,如果你對(duì)字符串拼接比較感興趣,可以私下自行研究下,今天的分享就到這里了!
可以說下,你都是使用哪種方式呢?
end
精品資源,超多福利,加微信免費(fèi)領(lǐng)取
長(zhǎng)安添加下方·二維碼
領(lǐng)取慶哥的編程自學(xué)秘籍(PDF電子書),朋友圈每天更新
常駐小尾巴
往期精彩推薦

我已經(jīng)不用 try catch 處理異常!太辣雞了!


