标题:Java 中实现字符串大小写互换的正确方法

本文详解如何在 java 中正确实现字符串中字母大小写的逐字符互换(小写变大写、大写变小写),指出常见逻辑错误,并提供高效、可读性强的解决方案。

原始代码存在多个关键问题:

  1. 嵌套条件逻辑错误:if(Character.isLowerCase(c)) { ... if(Character.isUpperCase(c)) { ... } } 中,一个字符不可能同时是小写又是大写,内层 if 永远不成立;
  2. 非字母字符被忽略且未保留:Character.isLetter(c) 外层判断后,非字母字符(如空格、数字、标点)完

    全丢失,导致输出截断;
  3. 字符串拼接性能低下:循环内使用 output += ... 会频繁创建新 String 对象,时间复杂度 O(n²),应避免;
  4. 缺少大写字母的处理分支:当字符为大写时,原逻辑未进入任何有效分支,直接跳过。

✅ 正确做法是:对每个字符独立判断其大小写属性,并做对应转换;非字母字符原样保留;优先使用可变字符串(如 StringBuilder)提升性能。

以下是推荐的现代 Java 实现(兼容 JDK 8+):

public static String toAlternativeCase(String str) {
    if (str == null) return null;
    StringBuilder result = new StringBuilder(str.length());
    for (char c : str.toCharArray()) {
        if (Character.isLowerCase(c)) {
            result.append(Character.toUpperCase(c));
        } else if (Character.isUpperCase(c)) {
            result.append(Character.toLowerCase(c));
        } else {
            result.append(c); // 保留数字、空格、符号等
        }
    }
    return result.toString();
}

? 调用示例:

public static void main(String[] args) {
    String input = "Elmar DidOkLTWdeee";
    System.out.println(toAlternativeCase(input)); 
    // 输出:eLMAR dIDoKltwDEEE
}

⚠️ 注意事项:

  • 不要使用 StringBuffer.replace() 配合 "" 拼接(如答案中所示),虽可行但冗余低效(每次 replace 触发内部数组复制);
  • StringBuilder 比 StringBuffer 更轻量(非线程安全但单线程场景下性能更优),除非明确需要同步,否则首选 StringBuilder;
  • 始终校验 null 输入,避免 NullPointerException;
  • 使用增强 for 循环和 toCharArray() 提高可读性,语义清晰。

总结:大小写互换本质是逐字符映射操作,核心在于分类明确、覆盖完整、性能可控。摒弃字符串累加与嵌套误判,采用 StringBuilder + 显式分支判断,即可写出健壮、高效、易维护的转换方法。