用for循环反转字符串时应避免直接修改String,因其不可变性会导致大量临时对象;正确做法是使用StringBuilder,初始化指定长度并从后往前append字符,或直接调用reverse()方法提升性能。

用 for 循环反转字符串时,别直接改 String 对象
Java 的 String 是不可变的,任何“修改”实际都生成新对象。如果在循环里反复拼接,比如用 +=,会创建大量临时 String 实例,性能差且易被误认为“原地反转”。
正确做法是先转成可变容器:
- 用
StringBuilder初始化长度(避免扩容),new StringBuilder(str.length()) - 从后往前遍历原字符串,
for (int i = str.length() - 1; i >= 0; i--) - 逐个
append字符,最后调toString()
示例:
String reversed = new StringBuilder().append(str).reverse().toString();——这行看似简洁,但底层仍是 for 循环实现,且复用了
StringBuilder 的高效追加逻辑。
判断回文时,循环只需走到一半,且注意大小写和非字母数字字符
回文本质是“对称”,没必要比完整个字符串。常见错误是循环条件写成 i ,导致重复比较甚至越界。
立即学习“Java免费学习笔记(深入)”;
关键点:
- 终止条件应为
i (整数除法自动向下取整) - 如果输入可能含空格、标点或大小写混杂,得先预处理:用
str.replaceAll("[^a-zA-Z0-9]", "").toLowerCase() - 避免在循环里反复调用
str.charAt(i)和str.charAt(j)——JVM 虽有优化,但明确存成局部变量更稳
示例对比:
错:直接比 "A man a plan a canal Panama" → false(因空格)
对:预处理后比 → true
for 循环里用 char 还是 int 做索引?别忽略 Unicode 补码问题
中文、emoji 等字符在 Java 中可能占两个 char(即代理对),单纯用 charAt(i) 遍历会切开一个 emoji,导致乱码或 StringIndexOutOfBoundsException。
安全做法:
- 若确定只处理 ASCII 或基本拉丁字母,用
char索引没问题 - 若需兼容中文、emoji,改用
codePointAt(i)+Character.charCount(cp)跳进下一个字符位置 - 更简单方案:转成
int[]码点数组再循环,或直接用str.codePoints().toArray()
例如:"??".length() 返回 2,但它是单个 emoji;用 codePoints().count() 才得 1。
性能敏感场景下,别让 for 循环成为瓶颈
纯 for 循环本身极快,但常见拖慢速度的操作藏在循环体内:
- 每次循环都调
str.length()—— 改成提前缓存int len = str.length() - 循环内新建对象(如
new String(...)或substring())—— 尽量复用缓冲区或用索引操作 - 用
==比较字符串内容 —— 必须用.equals(),否则永远返回false
特别提醒:回文判断中,如果字符串超长(比如 >1MB),用 StringBuilder.reverse() 比手写 for 更快——因为它的内部实现用了 System.arraycopy,而手动循环是解释执行的。


















