Java substring() 方法

Java substring() 方法中文讲解(2025年)

substring() 是 Java String 类中的方法,用于从字符串中提取子字符串。String 是 Java 中常用的不可变类,substring() 提供了一种高效的方式来操作字符串片段,广泛应用于文本处理、数据解析和 Web 开发。2025年,Java 21/22(LTS 版本)优化了字符串操作性能,substring() 仍是核心方法,特别是在 Spring 框架和 Kotlin Multiplatform(KMP)项目中处理文本数据时。本教程详细讲解 substring() 的语法、用法和实践,基于 Oracle 官方文档、CSDN 和 Java 社区,适合初学者和开发者。建议在 IntelliJ IDEA 或 Eclipse 中用 Java 11+(推荐 21)练习。


一、substring() 方法概览(必知)

  • 定义substring() 从字符串中提取指定范围的子字符串,返回新的 String 对象。
  • 核心用途
  • 提取字符串片段(如解析 URL、JSON)。
  • 格式化文本(如截取文件名、日期)。
  • 数据清洗(如去除前缀/后缀)。
  • 特点
  • 不可变:原字符串不变,返回新字符串。
  • 高效:Java 7+ 使用字符串共享,减少内存复制。
  • 简单:基于索引操作,直观易用。
  • 2025年趋势
  • Java 21/22 优化字符串处理,substring() 在大文本操作中更高效。
  • 在 KMP 项目中,substring() 用于 Java 模块解析 WebView 数据。
  • 结合正则表达式或 Text Blocks(Java 15+)处理复杂文本。

二、核心语法与用法(必会)

String 类中的两个 substring() 方法

  1. substring(int beginIndex)
  • 功能:从 beginIndex(包含)提取到字符串末尾。
  • 原型
    java public String substring(int beginIndex)
  • 参数
    • beginIndex:起始索引(从 0 开始,包含)。
  • 返回值:新的子字符串。
  • 异常StringIndexOutOfBoundsException(如果 beginIndex < 0beginIndex > length())。
  1. substring(int beginIndex, int endIndex)
  • 功能:从 beginIndex(包含)提取到 endIndex(不包含)。
  • 原型
    java public String substring(int beginIndex, int endIndex)
  • 参数
    • beginIndex:起始索引(包含)。
    • endIndex:结束索引(不包含)。
  • 返回值:新的子字符串。
  • 异常StringIndexOutOfBoundsException(如果 beginIndex < 0endIndex > length()beginIndex > endIndex)。

以下按用法讲解,包含示例代码,可直接运行。

1. 单参数用法
  • 提取从指定索引到末尾
  public class Main {
      public static void main(String[] args) {
          String str = "Hello, Java!";
          String sub = str.substring(7);
          System.out.println(sub); // 输出:Java!
      }
  }
  • 说明:从索引 7(J)提取到末尾。
2. 双参数用法
  • 提取指定范围
  public class Main {
      public static void main(String[] args) {
          String str = "Hello, Java!";
          String sub = str.substring(0, 5);
          System.out.println(sub); // 输出:Hello
      }
  }
  • 说明:从索引 0 到 4(不包含 5)。
3. 异常处理
  • 处理索引越界
  public class Main {
      public static void main(String[] args) {
          String str = "Hello";
          try {
              String sub = str.substring(10);
          } catch (StringIndexOutOfBoundsException e) {
              System.out.println("Invalid index: " + e.getMessage());
          }
      }
  }
  • 输出Invalid index: String index out of range: -5
4. 常见场景
  • 解析 URL
  public class Main {
      public static void main(String[] args) {
          String url = "https://example.com/path";
          String domain = url.substring(8, url.indexOf("/", 8));
          System.out.println(domain); // 输出:example.com
      }
  }
  • 提取文件扩展名
  public class Main {
      public static void main(String[] args) {
          String filename = "document.txt";
          String ext = filename.substring(filename.lastIndexOf(".") + 1);
          System.out.println(ext); // 输出:txt
      }
  }
5. 性能与内存
  • 内存效率(Java 7+):
  • substring() 返回的子字符串共享原始字符串的字符数组,仅存储新索引,节省内存。
  String large = "x".repeat(1000000);
  String sub = large.substring(0, 10);
  System.out.println(sub.length()); // 输出:10
  • 说明sub 不复制字符数组,仅引用原始数据。
  • 对比旧版本
  • Java 6 及以前,substring() 可能导致内存泄漏(因共享整个字符数组),需显式创建新字符串:
    java String newSub = new String(large.substring(0, 10)); // 强制复制

三、实践示例(综合应用)

  1. 解析 CSV 行
public class CsvParser {
    public static void main(String[] args) {
        String line = "Alice,25,Beijing";
        int comma1 = line.indexOf(",");
        int comma2 = line.lastIndexOf(",");

        String name = line.substring(0, comma1);
        String age = line.substring(comma1 + 1, comma2);
        String city = line.substring(comma2 + 1);

        System.out.printf("Name: %s, Age: %s, City: %s%n", name, age, city);
        // 输出:Name: Alice, Age: 25, City: Beijing
    }
}


功能:从 CSV 字符串提取字段。

  1. 日期格式化
public class DateFormatter {
    public static void main(String[] args) {
        String date = "2025-09-17";
        String year = date.substring(0, 4);
        String month = date.substring(5, 7);
        String day = date.substring(8);

        System.out.printf("Year: %s, Month: %s, Day: %s%n", year, month, day);
        // 输出:Year: 2025, Month: 09, Day: 17
    }
}


功能:从日期字符串提取年月日。

  1. KMP 集成(WebView 数据处理)
public class WebViewParser {
    // 模拟 KMP 项目中的 Java 模块
    public static String parseQuery(String url) {
        int queryStart = url.indexOf("?");
        if (queryStart != -1) {
            return url.substring(queryStart + 1); // 提取查询参数
        }
        return "";
    }

    public static void main(String[] args) {
        String url = "https://example.com?name=Alice&age=25";
        String query = parseQuery(url);
        System.out.println(query); // 输出:name=Alice&age=25
    }
}


功能:为 KMP 项目解析 WebView URL 的查询参数。


四、注意事项与最佳实践

  1. 索引范围
  • 确保 beginIndexendIndex 合法:
    java String str = "Hello"; try { str.substring(0, 10); // 抛出 StringIndexOutOfBoundsException } catch (StringIndexOutOfBoundsException e) { System.out.println("Invalid range"); }
  • 检查字符串长度:
    java if (str.length() >= endIndex) { str.substring(beginIndex, endIndex); }
  1. 性能优化
  • 避免重复调用 substring(),缓存结果:
    java String sub = str.substring(0, 5); // 缓存子字符串
  • 对于大字符串,结合 StringBuilder 处理复杂操作:
    java StringBuilder sb = new StringBuilder(); sb.append(str.substring(0, 5)).append("...");
  1. 替代方法
  • Java 15+ Text Blocks:简化多行字符串处理:
    java String html = """ <div>Hello, Java!</div> """; String content = html.substring(5, html.length() - 6); // 提取 Hello, Java!
  • 正则表达式:复杂解析时使用:
    java String str = "name=Alice"; String name = str.split("=")[1]; // 替代 substring
  1. 跨平台
  • 在 KMP 项目中,substring() 用于 Java 模块解析 WebView 数据,与 Kotlin 互操作:
    kotlin @CName("parseQuery") fun parseQuery(url: String): String { // 调用 Java substring }
  1. 2025年趋势
  • Java 22substring() 性能优化,适合大数据处理。
  • Spring MVCsubstring() 用于解析请求参数或路径。
  • AI 辅助:IntelliJ IDEA 的 Copilot 可生成 substring() 代码。

五、学习建议

  • 练习:用 substring() 实现 URL 解析或文件扩展名提取,测试异常处理。
  • 资源
  • Oracle 文档:https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/lang/String.html#substring(int)
  • CSDN:搜索“Java substring”。
  • B站:Java 教程(如“尚硅谷 Java”)。
  • 时间:1-2 小时掌握 substring(),1 天熟悉复杂场景。
  • 实践:开发文本解析或数据清洗程序。

六、总结

Java substring() 方法必知子字符串提取和不可变性,必会单/双参数用法和异常处理。2025年,substring() 在 Java 开发和 KMP 项目中不可或缺,结合 Java 21/22 优化更高效。相比正则表达式,substring() 简单且性能优越。

如果需要具体场景代码(如复杂解析或 KMP 示例)或有问题,告诉我,我可以提供更详细解答!

类似文章

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注