Java压缩字符串中连续重复字符的常用方法是遍历统计相邻相同字符个数并用StringBuilder拼接“字符+次数”,避免String+=导致O(n²)性能退化,需处理空串、单字符等边界情况。

Java 中压缩字符串中连续重复字符,常用方法是遍历字符串,统计相邻相同字符的个数,然后拼接“字符+次数”。核心在于避免频繁字符串拼接,推荐用 StringBuilder 提升性能。
基础实现:遍历计数 + StringBuilder
适用于一般场景,逻辑清晰,易于理解:
- 从索引 0 开始遍历,用变量记录当前字符和连续出现次数
- 遇到不同字符或到达末尾时,将“当前字符+次数”追加到
StringBuilder - 注意处理空字符串和单字符边界情况
public static String compress(String s) {
if (s == null || s.length() == 0) return s;
StringBuilder sb = new StringBuilder();
char cur = s.charAt(0);
int count = 1;
for (int i = 1; i < s.length(); i++) {
if (s.charAt(i) == cur) {
count++;
} else {
sb.append(cur).append(count);
cur = s.charAt(i);
count = 1;
}
}
sb.append(cur).append(count); // 别忘了最后一组
return sb.toString();
}
输入 "aaabbbcccd" → 输出 "a3b3c3d1"
进阶优化:只压缩长度 ≥2 的重复(可选)
若希望仅对重复≥2次的字符压缩(如 "abc" 不变,"aabb" → "a2b2"),只需在拼接前加判断:
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
立即学习“Java免费学习笔记(深入)”;
if (count > 1) sb.append(cur).append(count);- 否则直接
sb.append(cur)(即不压缩单个字符)
这样输出更紧凑,适合实际文本压缩需求。
注意事项与常见坑
- 不要用
String +=拼接——每次都会新建对象,时间复杂度退化为 O(n²) - 数字部分需转为字符串,但
append(int)在StringBuilder中已自动处理 - 若原始字符串极长,可预估
StringBuilder容量(如new StringBuilder(s.length())),减少扩容开销 - 该算法只处理「连续」重复,不处理全局去重(如
"abab"中的 a 不会被合并)
一行流写法(仅作参考,不建议生产使用)
借助 Java 8 Stream 可实现函数式风格,但可读性差、性能低、不易调试:
- 需先按连续分组(较麻烦,通常要借助第三方库或自定义 collector)
- 实际项目中优先选清晰、可维护的遍历方案
不复杂但容易忽略细节,掌握遍历+计数+StringBuilder 这一模式,就能稳稳应对多数字符串压缩需求。

















