欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java字符串拼接的優(yōu)雅方式實(shí)例詳解

 更新時(shí)間:2022年07月08日 18:47:49   作者:張小明dashing  
字符串拼接一般使用“+”,但是“+”不能滿足大批量數(shù)據(jù)的處理,下面這篇文章主要給大家介紹了關(guān)于Java字符串拼接的幾種優(yōu)雅方式,需要的朋友可以參考下

背景

字符串拼接不管是在業(yè)務(wù)上,還是寫算法時(shí)都會頻繁使用到。對于Java來說,字符串拼接有著很多種方式,他們之間的區(qū)別是什么,對應(yīng)不同的業(yè)務(wù)哪種更好用呢。

String底層原理

在討論字符串拼接時(shí),首先需要知道String的底層原理。

我們這里只討論jdk1.8之后的情況,看下結(jié)構(gòu)

private final byte[] value;

這一行代碼已經(jīng)可以說明很多東西。字符串實(shí)質(zhì)就是不可變的byte數(shù)組。因?yàn)椴豢勺?,所以對他進(jìn)行拼接對他拼接實(shí)際就是生成了多個(gè)對象,這就是不鼓勵(lì)對字符串進(jìn)行拼接的原因。但不可變也有很多好處,例如線程安全、可以存在字符串緩沖池復(fù)用字符串等。

拼接的方法

經(jīng)典但有時(shí)不優(yōu)雅的 +

String a = "123";
String b = "456";
String c = a + b;

c這個(gè)字符串就是ab拼接起來的字符串,“123456”

這段代碼反編譯出來的代碼是

String c = (new StringBuilder()).append(a).append(b).toString();

可以看出這個(gè) + 是Java的語法糖,他實(shí)際上是調(diào)用的StringBuilder,通過append()來進(jìn)行拼接。關(guān)于StringBuilder我們后面再講,先來講下這個(gè)用法的優(yōu)缺點(diǎn)。

優(yōu)點(diǎn)

“+”,最大的優(yōu)點(diǎn)就是簡潔。如果兩個(gè)字符串需要首尾拼接,+號義不容辭的成為了最好的使用方式。

缺點(diǎn)

說到缺點(diǎn)的話就多了。簡潔也是他的最大缺點(diǎn),也就是不夠靈活。

業(yè)務(wù)一

有一個(gè)字符串List,我需要把他們拼接起來,怎么辦?

for(String tmp:list){
    s += tmp;
}

簡潔的一批,但是他隱藏著很大的問題!

上面說到這種拼接方式實(shí)際是通過StringBuilder的append的方法。你不需要知道他的原理,你只需要知道,每次循環(huán),他都會new一個(gè)StringBuilder對象。創(chuàng)建對象的開銷是很大的,如果List有幾千幾萬,內(nèi)存開銷和時(shí)間開銷是不能接受的!

所以阿里巴巴的規(guī)范說到:

表面上是推薦,實(shí)際就是禁止。寫算法會消耗大量時(shí)間導(dǎo)致不通過,業(yè)務(wù)也會因?yàn)檫@種方式提高了無故的開銷,屬于領(lǐng)導(dǎo)看了想打死的代碼。

業(yè)務(wù)二

大家好,我叫XX,我是來自XXX學(xué)校的大X學(xué)生,我的愛好是XXX。

一個(gè)經(jīng)典的模板,我需要替換掉中間的XXX為controller的參數(shù),怎么辦呢?

String s = "大家好,我叫"+name+"我是來自"+school+"學(xué)校的大"+num+“學(xué)生,我的愛好是”+aihao;

屬于可用但極其丑陋的代碼。如果其他接口也需要這個(gè)模板,我還要把這段話復(fù)制到所有位置上嗎?如果我要改動(dòng)這個(gè),我要對所有代碼進(jìn)行改動(dòng)嗎。

萬能的StringBuilder

先介紹下StringBuilder的原理。把字符串拼接想象成數(shù)組就很好理解了,StringBuilder有點(diǎn)類似于ArrayList,可變數(shù)組。

 ? ?/**
 ? ? * The value is used for character storage.
 ? ? */
 ? ?char[] value;

區(qū)別就是沒有final修飾,當(dāng)?shù)竭_(dá)閾值時(shí)進(jìn)行擴(kuò)容操作。append方法就是往后插入。

那么就可以解決上面業(yè)務(wù)一的問題了。

StringBuilder sb = new StringBuilder();
for(String tmp:list){
    sb.append(tmp);
}
String s = sb.tostring();

相比于上面,只創(chuàng)建了一個(gè)StringBuilder對象,減少循環(huán)創(chuàng)建的開銷。

線程安全的StringBuffer

StringBuffer與StringBuilder相比,有線程安全的優(yōu)勢,通過上鎖的方式。同時(shí)導(dǎo)致效率略低于StringBuilder。

靈活的String.format()

這個(gè)嚴(yán)格來說應(yīng)該叫做格式化,但也可以用來拼接。

熟悉c語言的應(yīng)該能夠懂,我這里舉一個(gè)例子

String msg = String.format(“我是%s小學(xué)的學(xué)生,我愛吃%s”,"陽光","水果");
//輸出 我是陽光小學(xué)的學(xué)生,我愛吃水果

使用字符串鏈代替%s,生成需要的字符串。也不僅可以拼接字符串,可以看下下圖(偷的圖,沒全部驗(yàn)證過,錯(cuò)了別找我)

這種方式就解決了業(yè)務(wù)二的問題。通過編寫枚舉或者常量字符串留出對應(yīng)的位置,使用時(shí)再用String.format()拼接。

有點(diǎn)綠色的concat

為什么說他綠色呢,就是我還沒有找到他有什么優(yōu)勢。

String s = "123".concat("456");
//結(jié)果等價(jià)于
String s = "123" + "456";

concat方法的原理是數(shù)組擴(kuò)容后復(fù)制之前的內(nèi)容并寫新的內(nèi)容,和StringBuilder底層有點(diǎn)相像。

但是相比于“+”號來說,既不簡便,又沒有什么效率上的提高。在循環(huán)字符串拼接的條件,效率上會略有一點(diǎn)優(yōu)勢,但是這種情況是根本不被允許的,所以concat就很雞肋。

JDK1.8優(yōu)雅寫法

剛才提到業(yè)務(wù)一的解決辦法可以使用樸素的StringBuilder來解決,但是對于業(yè)務(wù)代碼來說有一點(diǎn)冗長。
Jdk1.8給出了優(yōu)雅的答案

String s = String.join("_", list);

一行代碼,就可以把list里的字符串通過“_”拼接起來。

經(jīng)典的Guava

guava是我們crud程序員的好伙伴,這里就不用多說了。我們最常接觸到的其實(shí)就是guava的本地緩存和字符串操作。

String result = Joiner.on(",").join(list);

也是簡潔的一句話,但是相比于jdk本土的字符串方法來說,他還有一些其他的特性。例如可以把為null的數(shù)組給跳過或者替換掉等等。功能要比jdk的要豐富一點(diǎn)。在正常的web項(xiàng)目里基本都會有Guava的依賴,使用起來還是很方便的。

總結(jié)

這篇文章偏重于代碼編寫方面,如何寫出簡潔高效的代碼,是我們要追求的。

到此這篇關(guān)于Java字符串拼接的優(yōu)雅方式的文章就介紹到這了,更多相關(guān)Java字符串拼接內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Springboot與Maven多環(huán)境配置的解決方案

    Springboot與Maven多環(huán)境配置的解決方案

    多環(huán)境配置的解決方案有很多,我看到不少項(xiàng)目的多環(huán)境配置都是使用Maven來實(shí)現(xiàn)的,本文就實(shí)現(xiàn)Springboot與Maven多環(huán)境配置,感興趣的可以了解下
    2021-06-06
  • Elasticsearch外部詞庫文件更新及使用

    Elasticsearch外部詞庫文件更新及使用

    這篇文章主要為大家介紹了Elasticsearch外部詞庫文件更新及使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-11-11
  • java IO流 之 輸入流 InputString()的使用

    java IO流 之 輸入流 InputString()的使用

    這篇文章主要介紹了java IO流 之 輸入流 InputString()的使用,以及讀取數(shù)據(jù)的三種方式詳解,非常不錯(cuò),需要的朋友可以參考下
    2016-12-12
  • springboot+thymeleaf+layui的實(shí)現(xiàn)示例

    springboot+thymeleaf+layui的實(shí)現(xiàn)示例

    本文主要介紹了springboot+thymeleaf+layui的實(shí)現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-12-12
  • java字符串的大寫字母右移實(shí)現(xiàn)方法

    java字符串的大寫字母右移實(shí)現(xiàn)方法

    下面小編就為大家?guī)硪黄猨ava字符串的大寫字母右移實(shí)現(xiàn)方法。小編覺得聽不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-04-04
  • java實(shí)現(xiàn)多設(shè)備同時(shí)登錄或強(qiáng)制下線

    java實(shí)現(xiàn)多設(shè)備同時(shí)登錄或強(qiáng)制下線

    本文主要介紹了java實(shí)現(xiàn)多設(shè)備同時(shí)登錄或強(qiáng)制下線,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-07-07
  • springboot配置文件中使用${}注入值的兩種方式小結(jié)

    springboot配置文件中使用${}注入值的兩種方式小結(jié)

    這篇文章主要介紹了springboot配置文件中使用${}注入值的兩種方式小結(jié),具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • junit4教程junit4.5官方下載

    junit4教程junit4.5官方下載

    前提:本文假設(shè)讀者已經(jīng)具有使用JUnit 4以前版本的經(jīng)驗(yàn)。
    2008-09-09
  • idea中springboot項(xiàng)目創(chuàng)建后追加依賴

    idea中springboot項(xiàng)目創(chuàng)建后追加依賴

    在項(xiàng)目創(chuàng)建的時(shí)候選擇好依賴創(chuàng)建項(xiàng)目,之后追加依賴不是很方便,本文就來介紹一下idea中springboot項(xiàng)目創(chuàng)建后追加依賴,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-03-03
  • java 實(shí)現(xiàn)漢諾塔詳解及實(shí)現(xiàn)代碼

    java 實(shí)現(xiàn)漢諾塔詳解及實(shí)現(xiàn)代碼

    這篇文章主要介紹了java 實(shí)現(xiàn)漢諾塔詳解及實(shí)現(xiàn)代碼的相關(guān)資料,需要的朋友可以參考下
    2017-04-04

最新評論