因为String不可变,循环中每次+拼接都会新建StringBuilder、append、toString,产生大量临时对象,增加内存分配与GC压力;StringBuilder可复用内部char数组,显著提升性能。
在 Java 中,用
替代
或
进行循环内字符串拼接,能避免频繁创建临时
对象,大幅减少堆内存分配与 GC 压力。
为什么普通字符串拼接在循环中开销大
是不可变类型。每次用
拼接(尤其在循环中),JVM 都会隐式新建一个
→
→
,最终生成一个新
实例。例如:
1000 次循环可能产生上千个短命的
和
对象,加重 Young GC 频率。
正确使用 StringBuilder 的关键写法
把
提到循环外初始化,复用同一实例;预估容量可进一步避免数组扩容:
Eclipse导入Android或其他的JAVA项目的正确方法 WORD版
本文档主要讲述的是Eclipse导入Android或其他的JAVA项目的正确方法;希望本文档会给有需要的朋友带来帮助;感兴趣的朋友可以过来看看
下载
立即学习
“
Java免费学习笔记(深入)
”;
显式声明并复用:不放在循环内 new,也不每次调用
后丢弃
合理设置初始容量:如已知拼接约 5000 字符,用
只在最终需要时调用
:避免中间多次转 String 导致新对象生成
注意编译器优化的边界情况
Java 编译器(
java
c)会对**静态字符串常量拼接**自动优化为单个常量(如
→
),此时无需手动改写。但只要涉及变量(尤其是循环变量、方法参数、运行时值),优化就失效,必须靠
显式控制。
✅ 安全优化:
→ 编译期合并
❌ 不优化:
(i 是变量)→ 每次都新建
⚠️ 注意日志场景:
在高频循环中也应重构
替代方案与补充建议
除手写
,还可考虑更高级或更安全的封装:
使用
(适合带分隔符的集合拼接):自动处理首尾逻辑,线程不安全但轻量
用
(Stream 场景):语义清晰,底层仍基于
避免过度优化:若拼接次数极少(如 ≤ 3 次)、且不在热点路径,可读性优先
StringBuilder+String.concat()StringString+StringBuilderappendtoString()StringString result = "";
for (int i = 0; i < 1000; i++) {
result += "item" + i; // 每轮都新建至少 2~3 个对象(含中间 StringBuilder 和 String)
}StringStringBuilderStringBuildertoString()new StringBuilder(5000)toString()StringBuilder sb = new StringBuilder(4096); // 预分配,避免动态扩容
for (int i = 0; i < 1000; i++) {
sb.append("item").append(i); // 复用同一对象,无新 String 产生
}
String result = sb.toString(); // 仅此处生成最终 String"a" + "b" + "c""abc"StringBuilderString s = "Hello" + "World";String s = prefix + i + suffix;log.info("User " + user.getId() + " logged in");StringBuilderStringJoinerCollectors.joining()StringBuilder// 示例:Stream + joining(推荐用于集合遍历)
String joined = list.stream()
.map(Object::toString)
.collect(Collectors.joining(", "));