將 List、Set、陣列轉為帶分隔符的字串是高頻需求。本文從手動迴圈、JDK 8+ String.join、Stream API、第三方庫四個維度,提供最佳實踐與效能建議。
List numList = new ArrayList<>();
for (int i = 1; i < 10; i++) numList.add(String.valueOf(i));
StringBuilder sb = new StringBuilder();
for (int i = 0; i < numList.size(); i++) {
if (i > 0) sb.append(",");
sb.append(numList.get(i));
}
String result = sb.toString(); // "1,2,3,4,5,6,7,8,9"
StringBuilder 避免字串不可變帶來的大量對象創建。String result = String.join(",", numList); // 一行搞定,自動處理空集合返回 ""
CharSequence delimiter, CharSequence... elements 或 Iterable<? extends CharSequence>。CharSequence(String 滿足),非 String 集合需先轉換。// 非 String 集合:先 map 轉字串
List intList = Arrays.asList(1,2,3,4,5);
String result = intList.stream()
.map(String::valueOf)
.collect(Collectors.joining(",")); // "1,2,3,4,5"
// 可自定前綴/後綴
String result2 = intList.stream()
.map(String::valueOf)
.collect(Collectors.joining(",", "[", "]")); // "[1,2,3,4,5]"
.parallelStream() 處理大集合。Collectors.joining 內部使用 StringJoiner,效能優於手動拼接。// Commons Lang
String result = StringUtils.join(numList, ",");
// Guava
String result = Joiner.on(",").join(numList);
String[] arr = {"abc", "123", "@#&"};
String result = String.join("", arr); // "abc123@#&" (無分隔符)
String result2 = String.join("-", arr); // "abc-123-@#&"
String result = Arrays.toString(arr); // "[abc, 123, @#&]"
int[] nums = {1,2,3,4,5};
StringBuilder sb = new StringBuilder();
for (int i = 0; i < nums.length; i++) {
if (i > 0) sb.append(",");
sb.append(nums[i]); // 自動裝箱/調用 String.valueOf
}
String result = sb.toString();
| 場景 | 推薦方式 | 理由 |
|---|---|---|
| JDK 8+ 一般集合/陣列 | String.join / Collectors.joining | 標準庫、可讀性高、效能好 |
| 需前綴後綴、複雜轉換 | Stream Collectors.joining(delim, prefix, suffix) | 靈活、鏈式調用 |
| JDK 7 或 Android 老版本 | StringBuilder 手動 / TextUtils.join (Android) | 兼容性 |
| 超大集合 (百萬+) | 並行流 .parallelStream() + Collectors.joining | 多核加速 |
| 基本型別陣列避免裝箱 | 手動 StringBuilder + 專用 Appendable 邏輯 | 減少 GC |
現代 Java (8+) 開發,首選 String.join 與 Stream Collectors.joining,代碼簡潔、標準化、效能可靠。手動 StringBuilder 僅用於極致效能調優或舊版本兼容。理解 CharSequence、StringJoiner、Collector 等底層機制,能在代碼審查中做出專業判斷。