在Java中如何使用String类处理文本_Java字符串常用方法解析

Java String不可变,所有修改操作均返回新对象;replace()等方法不改变原字符串,需重新赋值;substring取左闭右开区间;运行时拼接用StringBuilder更高效;比较字符串内容须用equals()而非==。

Java 的 String 类不可变,所有“修改”操作实际都返回新对象——这是绝大多数字符串误用问题的根源。

为什么 replace() 没生效?

因为 String 是不可变的,replace()toUpperCase()trim() 等方法从不修改原字符串,而是返回新实例。

  • 常见错误:
    String s = "  hello  ";
    s.replace(" ", "");
    s.trim();
    System.out.println(s); // 输出仍是 "  hello  "
  • 正确写法:必须重新赋值
    String s = "  hello  ";
    s = s.replace(" ", ""); // 注意这里赋值了
    s = s.trim();           // 也必须赋值
    System.out.println(s); // 输出 "hello"
  • 链式调用更安全:
    String result = s.trim().replace(" ", "").toLowerCase();

substring() 的边界到底怎么算?

substring(int beginIndex, int endIndex) 取的是 左闭右开区间,即包含 beginIndex,但不包含 endIndex。越界会抛 StringIndexOutOfBoundsException

  • "abc".substring(1, 2)"b"(索引 1 是 b,索引 2 是 c,但不包含)
  • "abc".substring(1)"bc"(单参数版本从指定位置到末尾)
  • 容易踩坑:用 length()endIndex 时别加 1,s.substring(0, s.length()) 才是完整字符串
  • 空字符串或 null 判断必须前置,否则直接调用会 NPE

拼接字符串该用 + 还是 StringBuilder

编译期确定的字面量拼接(如 "a" + "b" + "c")会被 JVM 优化为单个常量;但运行时变量拼接(尤其循环中)用 + 会产生大量中间 String 对象,性能差。

  • 少量、非循环拼接:str1 + str2 + "static" 可读性好,没问题
  • 循环内拼接(如构建日志、SQL):
    StringBuilder sb = new StringBuilder();
    for (String item : list) {
        sb.append(item).append(",");
    }
    String result = sb.toString(); // 最后才转 String
  • 注意:不要在循环里反复调用 sb.toString(),它每次都会新建对象
  • JDK 9+ 对 + 做了部分优化,但逻辑复杂时

    仍推荐显式用 StringBuilder

equals()== 到底该用哪个?

== 比较的是引用地址,equals() 比较的是字符内容。除非明确要判断是否为同一对象(极少见),否则一律用 equals()

  • 常见错误:
    if (s == "hello") { ... } // 错!可能因字符串池机制偶然成功,但不可靠
  • 正确写法:
    if ("hello".equals(s)) { ... } // 推荐把字面量放前面,避免 s 为 null 时 NPE
  • 忽略大小写用 equalsIgnoreCase(),别用 toLowerCase().equals()(创建多余对象)
  • 空安全判断可结合 Objects.equals(a, b)(JDK 7+),自动处理 null

字符串处理最易被忽略的其实是编码和 null 安全——new String(bytes, charset) 不指定编码名会依赖平台默认,split() 遇到 null 输入直接炸,这些地方没日志很难定位。