Java中常見字串拼接九種方式

zhangzhiping35發表於2024-03-20
一、前言
在 Java 程式設計中,字串拼接是一項非常基礎的操作,它涉及到了很多日常開發工作中常見的場景,例如拼接 SQL 語句、構建 HTTP 請求引數等等。因此,對於掌握好字串拼接技巧不僅有助於提高程式碼效率,而且能夠避免一些潛在的效能問題。

下面我們就來列舉出來幾種方式,搭配例子!

二、使用 "+" 運算子拼接字串
這是最常見的字串拼接方式,可以使用 + 運算子將多個字串連線起來,例如:


String str1 = "Hello";
String str2 = "World!";
String result = str1 + " " + str2;
System.out.println(result); 
// 輸出: Hello World!

『優點』 在於程式碼書寫簡單,易於理解和維護。

『缺點』 在於效能問題:每次使用 "+" 運算子連線字串時,都會建立一個新的 String 物件。如果需要頻繁拼接字串,那麼就會產生大量的臨時物件,導致記憶體空間浪費和效能下降。此外,由於 Java 中的 String 物件是不可變的,因此每次修改字串內容都會建立一個新的 String 物件,也會帶來額外的開銷。

三、使用 StringBuilder 或 StringBuffer 類
StringBuilder 和 StringBuffer 類都提供了 append() 方法用於拼接字串。例如:


StringBuilder sb = new StringBuilder();
sb.append("Hello");
sb.append(" ");
sb.append("World!");
String result = sb.toString();
System.out.println(result); 
// 輸出: Hello World!

StringBuffer sb1 = new StringBuffer();
sb1.append("Hello").append(" ").append("World");
String result1 = sb1.toString();
System.out.println(result1); 
// 輸出: Hello World!

「StringBuilder 的優點:」
StringBuilder 比較輕量級,不需要同步處理,因此更快速。
在單執行緒環境下使用時,StringBuilder 的效能比 StringBuffer 更好。
「StringBuilder 的缺點:」
StringBuilder 是非執行緒安全的,不能在多執行緒環境中使用。
StringBuilder 不支援指定初始容量以及增量大小,如果需求變化超出了其預設容量,可能會影響效能。
「StringBuffer 的優點:」
StringBuffer 是執行緒安全的,可在多執行緒環境中使用。
StringBuffer 支援指定初始容量以及增量大小,可以根據需求動態調整容量,減少記憶體重新分配的次數。
「StringBuffer 的缺點:」
StringBuffer 比 StringBuilder 重量級,需要同步處理,因此相對較慢。
在單執行緒環境下使用時,StringBuffer 的效能比 StringBuilder 差。
「總之,使用這兩個類可以避免建立大量的字串物件,從而提高效能。」

四、使用StringJoiner類
StringJoiner是一種較為新的字串拼接方式是使用 Java 8 引入的 StringJoiner 類。透過該類,可以更加簡潔地實現字串的拼接。

「這種方式在需要將多個字串拼接成一個以某個特定字元分隔、前字尾的字串時,比較方便和簡潔。」

StringJoiner 類提供了三個建構函式:

StringJoiner(CharSequence delimiter):使用指定的分隔符建立一個 StringJoiner 物件。StringJoiner(CharSequence delimiter, CharSequence prefix, CharSequence suffix):使用指定的分隔符、字首和字尾建立一個 StringJoiner 物件。

然後透過 add() 方法向 StringJoiner 物件新增元素,最後呼叫 toString() 方法獲取拼接後的字串。例如:


StringJoiner sj = new StringJoiner(",");
sj.add("apple");
sj.add("orange");
sj.add("banana");
String result = sj.toString();
System.out.println(result); 
// 輸出: apple,orange,banana

StringJoiner sj1 = new StringJoiner(",","[","]");
sj1.add("apple1");
sj1.add("orange1");
sj1.add("banana1");
String result1 = sj1.toString();
System.out.println(result1); 
// 輸出: apple,orange,banana


『優點』
簡單易用:使用StringJoiner類很容易理解和使用,只需要指定分隔符和可選的字首和字尾即可。
執行緒安全:StringJoiner是執行緒安全的,可以在多個執行緒中同時使用。
可變性:StringJoiner例項是可變的,可以向其中新增新元素,而不必建立新的例項。
『缺點』
可能會影響效能:雖然StringJoiner提供了一種方便的方法來拼接字串,但在某些情況下可能會影響效能。例如,如果您需要拼接大量的字串,可能會導致過多的記憶體分配和垃圾回收。
不適合複雜的字串操作:StringJoiner適用於簡單的字串拼接操作,但對於複雜的字串操作,可能需要使用其他更強大的庫或自定義演算法。
五、使用String類join方法
String.join() 方法用於拼接字串。該方法可以將一個字串陣列或其他可迭代物件中的元素連線成一個字串,並使用指定的分隔符分隔它們。例如:


String[] fruits = {"apple", "banana", "orange"};
List<String> list = Arrays.asList("apple", "banana", "orange")
String result = String.join(", ", fruits);
System.out.println(result); 
// 輸出:apple, banana, orange

優缺點和上面的差不多的,只不過沒有上面的StringJoiner 類強大,可以指定前字尾!

六、使用StringUtils類
StringUtils.join()方法是Apache Commons Lang庫中的一個字串工具類方法,有很多個方法過載這裡就不展示了,不傳分隔符預設。用於將多個字串拼接成一個字串。例如:


String[] arr = {"Hello", "World"};
String str = StringUtils.join(Arrays.asList(arr), ' ');
System.out.println(str);
// 輸出:Hello World

總的來說,對於小型專案或者對效能要求不高的情況下,StringUtils.join()是一種方便、靈活、易用的字串拼接方式。但 在對效能要求較高的大型專案中,可能需要使用其他更為高效的字串拼接方式。

七、使用String類concat方法
String.concat() 方法用於將一個或多個字串連線起來形成一個新的字串。例如:


String str1 = "Hello";
String str2 = "world";
String str3 = str1.concat(" ").concat(str2);

System.out.println(str3);  
// 輸出: Hello world

如果拼接的字串是null,concat()會丟擲NullPointerException。

每次呼叫 concat() 方法都會建立一個新的字串物件,只能連線兩個字串。不是很推薦使用!

八、其他幾種方式
1、使用 String.format() 方法格式化字串

String str = String.format("Hello %s", "World");2、使用 Stream實現

List<String> list = Arrays.asList("Hello", "World");
String str = list.stream().collect(Collectors.joining(" "));

九、總結
在 Java 中,字串拼接是很常見的操作。不同的場景需要選擇合適的字串拼接方式,以達到更高的效率和更好的程式碼可讀性。理解字串拼接的不同方式,選擇適合當前場景的方法能夠提高程式碼效率、可讀性和可維護性。因此,在實際開發中,應該根據具體需求,靈活選擇合適的字串拼接方式。

這裡給出自己的建議:

使用 StringBuilder 或 StringBuffer 更適合「需要頻繁修改字串的場景」,而使用 StringJoiner 則適用於「需要在每個元素之間新增分隔符的場景」,當然StringUtils也是可以選擇的!

相關文章