您好,登錄后才能下訂單哦!
在為什么阿里巴巴不建議在for循環中使用”+”進行字符串拼接一文中,我們介紹了幾種Java中字符串拼接的方式,以及優缺點。其中還有一個重要的拼接方式我沒有介紹,那就是Java 8中提供的StringJoiner ,本文就來介紹一下這個字符串拼接的新兵。
如果你想知道一共有多少種方法可以進行字符串拼接,教你一個簡單的辦法,在Intellij IDEA中,定義一個Java Bean,然后嘗試使用快捷鍵自動生成一個toString方法,IDEA會提示多種toString生成策略可供選擇。
11111
目前我使用的IDEA的toString生成策略默認的是使用JDK 1.8提供的StringJoiner。
介紹
StringJoiner是java.util包中的一個類,用于構造一個由分隔符分隔的字符序列(可選),并且可以從提供的前綴開始并以提供的后綴結尾。雖然這也可以在StringBuilder類的幫助下在每個字符串之后附加分隔符,但StringJoiner提供了簡單的方法來實現,而無需編寫大量代碼。
StringJoiner類共有2個構造函數,5個公有方法。其中最常用的方法就是add方法和toString方法,類似于StringBuilder中的append方法和toString方法。
用法
StringJoiner的用法比較簡單,下面的代碼中,我們使用StringJoiner進行了字符串拼接。
public class StringJoinerTest { public static void main(String[] args) { StringJoiner sj = new StringJoiner("Hollis"); sj.add("hollischuang"); sj.add("Java干貨"); System.out.println(sj.toString()); StringJoiner sj1 = new StringJoiner(":","[","]"); sj1.add("Hollis").add("hollischuang").add("Java干貨"); System.out.println(sj1.toString()); } }
以上代碼輸出結果:
hollischuangHollisJava干貨 [Hollis:hollischuang:Java干貨]
值得注意的是,當我們StringJoiner(CharSequence delimiter)初始化一個StringJoiner的時候,這個delimiter其實是分隔符,并不是可變字符串的初始值。
StringJoiner(CharSequence delimiter,CharSequence prefix,CharSequence suffix)的第二個和第三個參數分別是拼接后的字符串的前綴和后綴。
原理
介紹了簡單的用法之后,我們再來看看這個StringJoiner的原理,看看他到底是如何實現的。主要看一下add方法:
public StringJoiner add(CharSequence newElement) { prepareBuilder().append(newElement); return this; } private StringBuilder prepareBuilder() { if (value != null) { value.append(delimiter); } else { value = new StringBuilder().append(prefix); } return value; }
看到了一個熟悉的身影——StringBuilder ,沒錯,StringJoiner其實就是依賴StringBuilder實現的,在為什么阿里巴巴不建議在for循環中使用”+”進行字符串拼接中我們介紹過StringBuilder的實現原理,本文不在贅述。
當我們發現StringJoiner其實是通過StringBuilder實現之后,我們大概就可以猜到,他的性能損耗應該和直接使用StringBuilder差不多!
為什么需要StringJoiner
在了解了StringJoiner的用法和原理后,可能很多讀者就會產生一個疑問,明明已經有一個StringBuilder了,為什么Java 8中還要定義一個StringJoiner呢?到底有什么好處呢?
如果讀者足夠了解Java 8的話,或許可以猜出個大概,這肯定和Stream有關。
作者也在Java doc中找到了答案:
A StringJoiner may be employed to create formatted output from a Stream using Collectors.joining(CharSequence)
試想,在Java中,如果我們有這樣一個List:
List<String> list = ImmutableList.of("Hollis","hollischuang","Java干貨");
如果我們想要把他拼接成一個以下形式的字符串:
Hollis,hollischuang,Java干貨
可以通過以下方式:
StringBuilder builder = new StringBuilder(); if (!list.isEmpty()) { builder.append(list.get(0)); for (int i = 1, n = list.size(); i < n; i++) { builder.append(",").append(list.get(i)); } } builder.toString();
還可以使用:
list.stream().reduce(new StringBuilder(), (sb, s) -> sb.append(s).append(','), StringBuilder::append).toString();
但是輸出結果稍有些不同,需要進行二次處理:
Hollis,hollischuang,Java干貨,
還可以使用”+”進行拼接:
list.stream().reduce((a,b)->a + "," + b).toString();
以上幾種方式,要么是代碼復雜,要么是性能不高,或者無法直接得到想要的結果。
為了滿足類似這樣的需求,Java 8中提供的StringJoiner就派上用場了。以上需求只需要一行代碼:
list.stream().collect(Collectors.joining(":"))
即可。上面用的表達式中,Collectors.joining的源代碼如下:
public static Collector<CharSequence, ?, String> joining(CharSequence delimiter, CharSequence prefix, CharSequence suffix) { return new CollectorImpl<>( () -> new StringJoiner(delimiter, prefix, suffix), StringJoiner::add, StringJoiner::merge, StringJoiner::toString, CH_NOID); }
其實現原理就是借助了StringJoiner。
當然,或許在Collector中直接使用StringBuilder似乎也可以實現類似的功能,只不過稍微麻煩一些。所以,Java 8中提供了StringJoiner來豐富Stream的用法。
而且StringJoiner也可以方便的增加前綴和后綴,比如我們希望得到的字符串是[Hollis,hollischuang,Java干貨]而不是Hollis,hollischuang,Java干貨的話,StringJoiner的優勢就更加明顯了。
總結
本文介紹了Java 8中提供的可變字符串類——StringJoiner,可以用于字符串拼接。
StringJoiner其實是通過StringBuilder實現的,所以他的性能和StringBuilder差不多,他也是非線程安全的。
如果日常開發中中,需要進行字符串拼接,如何選擇?
1、如果只是簡單的字符串拼接,考慮直接使用”+”即可。
2、如果是在for循環中進行字符串拼接,考慮使用StringBuilder和StringBuffer。
3、如果是通過一個List進行字符串拼接,則考慮使用StringJoiner。
以上就是本次介紹的全部知識點內容,感謝大家對億速云的支持。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。