循環拼接字符串時,常產生多餘的尾部分隔符(如 "a,b,c,"),需移除最後一個逗號得到 "a,b,c"。
String memberNames = "";
for (int t = 0; t < memberLen; t++) {
String memTemp = stafferMap.get(strMember[t]);
if (memTemp != null) {
memberNames += memTemp + ",";
}
}
if (memberNames.length() > 0) {
memberNames = memberNames.substring(0, memberNames.length() - 1);
}
缺點:字符串不可變,循環中 += 會頻繁創建新對象,GC 壓力大;substring 又創建一次對象。
StringBuilder sb = new StringBuilder();
for (int t = 0; t < memberLen; t++) {
String memTemp = stafferMap.get(strMember[t]);
if (memTemp != null) {
if (sb.length() > 0) {
sb.append(","); // 非首個元素前加分隔符
}
sb.append(memTemp);
}
}
String result = sb.toString();
優點:單次內存分配,無臨時對象,邏輯清晰,效能最優。
String result = Arrays.stream(strMember)
.map(stafferMap::get)
.filter(Objects::nonNull)
.collect(Collectors.joining(","));
適用場景:集合/數組轉字符串,可讀性極強,內部同樣基於 StringJoiner/StringBuilder 實現。
| 方案 | 時間複雜度 | 內存分配 | 可讀性 | 推薦指數 |
|---|---|---|---|---|
| substring 截取 | O(n²) | 極多 | 中 | ⭐ |
| StringBuilder 判斷 | O(n) | 極少 | 高 | ⭐⭐⭐⭐⭐ |
| Stream joining | O(n) | 少 | 極高 | ⭐⭐⭐⭐ |
StringBuilder 手動控制(無第三方依賴、效能可控)。Collectors.joining() 或 String.join()(簡潔表達意圖)。+= 拼接字符串。Joiner、Apache Commons StringUtils.join() 同樣優秀,視項目依賴選擇。