亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java字符串拼接的示例分析

發布時間:2021-07-29 10:09:48 來源:億速云 閱讀:176 作者:小新 欄目:開發技術

這篇文章主要介紹了Java字符串拼接的示例分析,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。

背景

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

String底層原理

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

我們這里只討論jdk1.8之后的情況,看下結構

private final byte[] value;

這一行代碼已經可以說明很多東西。字符串實質就是不可變的byte數組。因為不可變,所以對他進行拼接對他拼接實際就是生成了多個對象,這就是不鼓勵對字符串進行拼接的原因。但不可變也有很多好處,例如線程安全、可以存在字符串緩沖池復用字符串等。

拼接的方法

經典但有時不優雅的 +

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

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

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

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

可以看出這個 + 是Java的語法糖,他實際上是調用的StringBuilder,通過append()來進行拼接。關于StringBuilder我們后面再講,先來講下這個用法的優缺點。

優點

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

缺點

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

業務一

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

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

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

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

所以阿里巴巴的規范說到:

Java字符串拼接的示例分析

表面上是推薦,實際就是禁止。寫算法會消耗大量時間導致不通過,業務也會因為這種方式提高了無故的開銷,屬于領導看了想打死的代碼。

業務二

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

一個經典的模板,我需要替換掉中間的XXX為controller的參數,怎么辦呢?

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

屬于可用但極其丑陋的代碼。如果其他接口也需要這個模板,我還要把這段話復制到所有位置上嗎?如果我要改動這個,我要對所有代碼進行改動嗎。

萬能的StringBuilder

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

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

區別就是沒有final修飾,當到達閾值時進行擴容操作。append方法就是往后插入。

那么就可以解決上面業務一的問題了。

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

相比于上面,只創建了一個StringBuilder對象,減少循環創建的開銷。

線程安全的StringBuffer

StringBuffer與StringBuilder相比,有線程安全的優勢,通過上鎖的方式。同時導致效率略低于StringBuilder。

靈活的String.format()

這個嚴格來說應該叫做格式化,但也可以用來拼接。

熟悉c語言的應該能夠懂,我這里舉一個例子

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

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

Java字符串拼接的示例分析

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

有點綠色的concat

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

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

concat方法的原理是數組擴容后復制之前的內容并寫新的內容,和StringBuilder底層有點相像。

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

JDK1.8優雅寫法

剛才提到業務一的解決辦法可以使用樸素的StringBuilder來解決,但是對于業務代碼來說有一點冗長。
Jdk1.8給出了優雅的答案

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

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

經典的Guava

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

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

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

感謝你能夠認真閱讀完這篇文章,希望小編分享的“Java字符串拼接的示例分析”這篇文章對大家有幫助,同時也希望大家多多支持億速云,關注億速云行業資訊頻道,更多相關知識等著你來學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

徐州市| 双峰县| 莱西市| 岳阳市| 新龙县| 贵德县| 庆阳市| 布尔津县| 板桥市| 泰安市| 西乌珠穆沁旗| 庆元县| 洛南县| 上蔡县| 航空| 宜城市| 安吉县| 旬邑县| 抚顺县| 临朐县| 安平县| 泰宁县| 东兴市| 武鸣县| 恩平市| 鲁山县| 日照市| 泗阳县| 温州市| 德兴市| 呼玛县| 黑龙江省| 海安县| 喀什市| 察隅县| 汨罗市| 马鞍山市| 定兴县| 开阳县| 江阴市| 盐山县|