- 資訊首頁(yè) > 開(kāi)發(fā)技術(shù) >
- java字符串怎么拼接
本篇內容介紹了“java字符串怎么拼接”的有關(guān)知識,在實(shí)際案例的操作過(guò)程中,不少人都會(huì )遇到這樣的困境,接下來(lái)就讓小編帶領(lǐng)大家學(xué)習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學(xué)有所成!
前言
String底層原理
1. 普通寫(xiě)法
2. StringJoiner
3. guava joiner
4. 小結
字符串拼接不管是在業(yè)務(wù)上,還是寫(xiě)算法時(shí)都會(huì )頻繁使用到。
相信沒(méi)有小伙伴沒(méi)有寫(xiě)過(guò)這樣的代碼,比如說(shuō)現在讓我們來(lái)實(shí)現一個(gè)字符串拼接的場(chǎng)景,怎樣的實(shí)現才算是優(yōu)雅的呢?
以將int數組轉為英文逗號分隔的字符串為例進(jìn)行演示
在討論字符串拼接時(shí),首先需要知道String的底層原理。
看下結構
private final byte[] value;
這一行代碼已經(jīng)可以說(shuō)明很多東西。字符串實(shí)質(zhì)就是不可變的byte數組。因為不可變,所以對他進(jìn)行拼接對他拼接實(shí)際就是生成了多個(gè)對象,這就是不鼓勵對字符串進(jìn)行拼接的原因。但不可變也有很多好處,例如線(xiàn)程安全、可以存在字符串緩沖池復用字符串等。
直接使用StringBuilder來(lái)拼接
public String join(List<Integer> list) { StringBuilder builder = new StringBuilder(); for(Integer sub: list) { builder.append(sub).append(","); } return builder.substring(0, builder.length() - 1); }
上面這種寫(xiě)法相信比較常見(jiàn),相對來(lái)說(shuō)不太順眼的地方就是最后的toString,需要將最后的一個(gè)英文逗號給干掉
當然也可以用下面這種事前判斷方式,避免最終的字符串截取
public String join2(List<Integer> list) { StringBuilder builder = new StringBuilder(); boolean first = true; for (Integer sub: list) { if (first) { first = false; } else { builder.append(","); } builder.append(sub); } return builder.toString(); }
上面實(shí)現中,干掉最后的一個(gè)分隔符實(shí)在不是很優(yōu)雅,那么有更好一點(diǎn)的用法么,接下來(lái)看一下使用StringJoiner的方式
public String join3(List<Integer> list) { StringJoiner joiner = new StringJoiner(","); for (Integer s : list) { joiner.add(String.valueOf(s)); } return joiner.toString(); }
StringJoiner由jdk1.8提供,除了上面的基礎玩法之外,結合jdk1.8帶來(lái)的流操作方式,可以更簡(jiǎn)潔的實(shí)現
return list.stream().map(String::valueOf).collect(Collectors.joining(","));
怎么樣,上面這個(gè)實(shí)現比起前面的代碼是不是要簡(jiǎn)潔多了,一行代碼完事
如果使用的jdk還不是1.8版本,不能使用上面的StringJoiner,沒(méi)關(guān)系,還有g(shù)uava的Joiner也可以實(shí)現
public String join5(List<Integer> list) { return Joiner.on(",").join(list); }
注意
接收的參數類(lèi)型為: 數組/Iterable/Iterator/可變參數, 基本上可以覆蓋我們日常的業(yè)務(wù)場(chǎng)景
本篇文章的主題是一個(gè)非常非常常見(jiàn)的字符串拼接,一般來(lái)講,我們在做字符串拼接時(shí),最麻煩的事情就是分隔符的處理,要么就是分隔符前置添加,每次循環(huán)都需要判斷是否為開(kāi)頭;要么就是后置,最后取字符串時(shí),干掉最后一個(gè)分隔符
本文提供了一個(gè)非常使用的方式StringJoiner,完全解決了上面的分隔符問(wèn)題,它的使用有兩種場(chǎng)景
簡(jiǎn)單的容器轉String:直接借助Stream的Collectors.joining來(lái)實(shí)現
for循環(huán) (這種場(chǎng)景一般是for循環(huán)內的邏輯不僅僅包括字符串拼接,還包括其他的業(yè)務(wù)邏輯): 循環(huán)內直接執行stringJoiner.add()添加
對于jdk1.8及以上的版本,優(yōu)先推薦使用上面說(shuō)的StringJoiner來(lái)實(shí)現
免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng )、來(lái)自互聯(lián)網(wǎng)轉載和分享為主,文章觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權請聯(lián)系QQ:712375056 進(jìn)行舉報,并提供相關(guān)證據,一經(jīng)查實(shí),將立刻刪除涉嫌侵權內容。
Copyright ? 2009-2021 56dr.com. All Rights Reserved. 特網(wǎng)科技 特網(wǎng)云 版權所有 珠海市特網(wǎng)科技有限公司 粵ICP備16109289號
域名注冊服務(wù)機構:阿里云計算有限公司(萬(wàn)網(wǎng)) 域名服務(wù)機構:煙臺帝思普網(wǎng)絡(luò )科技有限公司(DNSPod) CDN服務(wù):阿里云計算有限公司 中國互聯(lián)網(wǎng)舉報中心 增值電信業(yè)務(wù)經(jīng)營(yíng)許可證B2
建議您使用Chrome、Firefox、Edge、IE10及以上版本和360等主流瀏覽器瀏覽本網(wǎng)站