
本文详解如何高效、准确地将字符串中每个字母的大小写进行互换(大写变小写,小写变大写),指出原始代码的逻辑错误,并提供基于 `stringbuffer` 的可修改方案及更现代的 `stringbuilder` 优化写法。
原始代码存在多个关键问题:
- 逻辑嵌套错误:在 if (Character.isLowerCase(c)) 分支内,又写了 if (Character.isUpperCase(c)) —— 此条件永远为 false,导致分支失效;
- 遗漏大写字母处理:未对 Character.isUpperCase(c) 的情况编写对应转换逻辑;
- 性能低效:使用 output += ... 拼接字符串,在循环中会频繁创建新 String 对象(String 不可变),时间复杂度达 O(n²);
- 非字母字符被忽略:虽合理(通常只需转换字母),但原始代码未保留这些字符(如空格、数字、标点),导致输出缺失。
✅ 正确思路应为:
遍历每个字符 → 若为小写字母,转为大写;若为大写字母,转为小写;其余字符原样保留。
推荐使用 StringBuilder(线程不安全但性能更高,适用于单线程场景)替代 StringBuffer(同步开销大,已过时):
public static String toAlternativeCase(String str) {
if (str == null) return null;
StringBuilder sb = new StringBuilder(str.length());
for (int i = 0; i < str.length(); i++) {
char c = str.charAt(i);
if (Character.isLowerCase(c)) {
sb.append(Character.toUpperCase(c));
} else if (Character.isUpperCase(c)) {
sb.append(Character.toLowerCase(c));
} else {
sb.append(c); // 保留数字、空格、符号等非字母字符
}
}
return sb.toString();
}调用示例:
public static void main(String[] args) {
String input = "Elmar DidOkLTWdeee";
System.out.println(toAlternativeCase(input));
// 输出:eLMAR dIDoKltwDEEE
}⚠️ 注意事项:
- 避免在循环中用 += 拼接字符串,务必使用 StringBuilder 或 StringBuffer;
- 显式处理 else if (Character.isUpperCase(c)),不可依赖嵌套误判;
- Character.isLetter(c) 可替代 isLowerCase || isUpperCase 组合判断,但需注意它对非 ASCII 字母(如带重音符号的字符)也返回 true,而 toUpperCase/toLowerCase 在默认 Locale 下能正确处理多数 Unicode 字母;
- 如需国际化支持(如土耳其语特殊规则),应指定 Locale 参数,例如 Character.toUpperCase(c, Locale.ENGLISH)。
总结:大小写互换本质是逐字符映射操作,核心在于逻辑完备性与实现效率。使用 StringBuilder + 清晰分支判断,即可写出健壮、可读、高性能的转换方法。










