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()
方法:
substring(int beginIndex)
:
- 功能:从
beginIndex
(包含)提取到字符串末尾。 - 原型:
java public String substring(int beginIndex)
- 参数:
beginIndex
:起始索引(从 0 开始,包含)。
- 返回值:新的子字符串。
- 异常:
StringIndexOutOfBoundsException
(如果beginIndex < 0
或beginIndex > length()
)。
substring(int beginIndex, int endIndex)
:
- 功能:从
beginIndex
(包含)提取到endIndex
(不包含)。 - 原型:
java public String substring(int beginIndex, int endIndex)
- 参数:
beginIndex
:起始索引(包含)。endIndex
:结束索引(不包含)。
- 返回值:新的子字符串。
- 异常:
StringIndexOutOfBoundsException
(如果beginIndex < 0
、endIndex > 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)); // 强制复制
三、实践示例(综合应用)
- 解析 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 字符串提取字段。
- 日期格式化:
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
}
}
功能:从日期字符串提取年月日。
- 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 的查询参数。
四、注意事项与最佳实践
- 索引范围:
- 确保
beginIndex
和endIndex
合法: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); }
- 性能优化:
- 避免重复调用
substring()
,缓存结果:java String sub = str.substring(0, 5); // 缓存子字符串
- 对于大字符串,结合
StringBuilder
处理复杂操作:java StringBuilder sb = new StringBuilder(); sb.append(str.substring(0, 5)).append("...");
- 替代方法:
- 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
- 跨平台:
- 在 KMP 项目中,
substring()
用于 Java 模块解析 WebView 数据,与 Kotlin 互操作:kotlin @CName("parseQuery") fun parseQuery(url: String): String { // 调用 Java substring }
- 2025年趋势:
- Java 22:
substring()
性能优化,适合大数据处理。 - Spring MVC:
substring()
用于解析请求参数或路径。 - 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 示例)或有问题,告诉我,我可以提供更详细解答!