Java substring() 方法(手把手讲解)
💡一则或许对你有用的小广告
欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论
- 新项目:《从零手撸:仿小红书(微服务架构)》 正在持续爆肝中,基于
Spring Cloud Alibaba + Spring Boot 3.x + JDK 17...
,点击查看项目介绍 ;- 《从零手撸:前后端分离博客项目(全栈开发)》 2 期已完结,演示链接: http://116.62.199.48/ ;
截止目前, 星球 内专栏累计输出 82w+ 字,讲解图 3441+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 2900+ 小伙伴加入学习 ,欢迎点击围观
在 Java 编程中,字符串(String)的处理是一项基础且高频的操作。无论是解析数据、格式化输出,还是提取特定信息,开发者都需要灵活地对字符串进行切割、拼接或筛选。而 Java substring() 方法
正是实现这一目标的核心工具之一。本文将从零开始,深入解析这一方法的原理、使用场景及常见误区,并通过实际案例帮助读者掌握其应用技巧。
一、Java substring() 方法的基本语法与核心功能
1.1 基础用法:截取字符串片段
substring()
方法允许开发者通过指定起始索引和结束索引,从字符串中提取子字符串。其核心语法如下:
String substring(int beginIndex)
String substring(int beginIndex, int endIndex)
- 参数说明:
beginIndex
:子字符串的起始索引(包含该位置字符)。endIndex
(可选):子字符串的结束索引(不包含该位置字符)。
示例代码:
String str = "Hello World";
String sub1 = str.substring(6); // 从索引6开始截取到末尾,结果:"World"
String sub2 = str.substring(0, 5); // 从索引0到5(不含5),结果:"Hello"
1.2 索引规则与常见误区
Java 字符串的索引从 0 开始,且 endIndex
参数指定的位置是“不包含”的。例如,substring(0, 5)
实际截取的是前5个字符,而非前6个字符。这一规则常被开发者误用,需特别注意。
比喻说明:
可以将字符串想象成一段连续的轨道,每个字符占据一个站点。beginIndex
是列车的起点站,而 endIndex
是列车的终点站。列车会从起点站出发,经过所有站点,但最终会在终点站的前一站停下。
二、深入理解参数与异常处理
2.1 参数边界条件与异常场景
substring()
方法对参数有严格限制:
- 索引越界:若
beginIndex
小于0、大于字符串长度,或endIndex
小于beginIndex
,会抛出StringIndexOutOfBoundsException
。 - 参数类型:参数必须是
int
类型,若传递其他类型需显式转换。
案例分析:
String text = "Java";
// 错误示例:beginIndex 超过字符串长度
// text.substring(4); // 抛出异常,因为索引4超出范围(字符串长度为4)
// 错误示例:endIndex 小于 beginIndex
// text.substring(2, 1); // 抛出异常
2.2 安全使用技巧
为避免异常,建议在调用 substring()
前先验证参数范围:
public static String safeSubstring(String str, int beginIndex, int endIndex) {
if (str == null) return "";
int len = str.length();
if (beginIndex < 0 || beginIndex > len) {
throw new IllegalArgumentException("Invalid beginIndex");
}
if (endIndex < beginIndex || endIndex > len) {
throw new IllegalArgumentException("Invalid endIndex");
}
return str.substring(beginIndex, endIndex);
}
三、进阶技巧与实际应用
3.1 结合其他字符串方法增强功能
通过与 trim()
、split()
等方法结合,substring()
可实现更复杂的文本处理:
// 示例:去除字符串首尾的空格后截取内容
String trimmed = " Hello ".trim();
String result = trimmed.substring(0, 3); // 结果:"Hel"
// 示例:分割字符串并提取部分字段
String path = "/user/profile";
String[] parts = path.split("/");
String segment = parts[2]; // 结果:"profile"
3.2 处理多字节字符的注意事项
Java 字符串采用 Unicode 编码,每个字符占用 2 字节。若处理中文等多字节字符,需确保索引位置的准确性:
String chinese = "你好世界";
// 截取前两个中文字符(索引0到4)
String part = chinese.substring(0, 4); // 结果:"你好"
注意:每个中文字符的索引递增为 1
,而非实际字节长度。
四、与 substring(int beginIndex, int endIndex) 的区别
Java 提供了两种 substring()
重载方法:
- 单参数版本:
substring(int beginIndex)
,默认截取到字符串末尾。 - 双参数版本:
substring(int beginIndex, int endIndex)
,截取指定区间。
对比案例:
String text = "Java Programming";
String part1 = text.substring(4); // 结果:"Programming"
String part2 = text.substring(4, 8); // 结果:"Prog"
五、实际应用场景与案例解析
5.1 日志解析:提取时间戳
假设日志格式为 "[2023-10-05 14:30:45] Error: ..."
,可通过 substring()
提取时间部分:
String log = "[2023-10-05 14:30:45] Error: Connection failed";
String timestamp = log.substring(1, 20); // 结果:"2023-10-05 14:30:45"
5.2 用户输入处理:去除特殊符号
若需从用户输入中提取邮箱域名:
String input = "user@example.com";
int atIndex = input.indexOf("@");
String domain = input.substring(atIndex + 1); // 结果:"example.com"
六、性能优化与替代方案
6.1 内存优化:避免频繁创建字符串
由于 substring()
会生成新字符串对象,频繁操作可能导致内存压力。可改用 StringBuilder
或 CharSequence
接口优化:
// 低效写法:多次调用 substring()
String str = "abcdef";
str = str.substring(2); // "cdef"
str = str.substring(1); // "def"
// 高效写法:使用 CharSequence 接口
CharSequence cs = str.subSequence(2, 5); // 结果:"cde"
6.2 替代方法:使用 Apache Commons Lang
若需更灵活的字符串截取,可结合第三方库(如 StringUtils
):
import org.apache.commons.lang3.StringUtils;
String text = "Java is fun";
String truncated = StringUtils.substring(text, 4, 6); // 结果:"is"
结论
Java substring() 方法
是字符串处理的核心工具,其简洁性与灵活性使其在日常开发中不可或缺。通过掌握其语法、参数规则及常见问题的解决方法,开发者能够高效地完成文本解析、数据提取等任务。此外,结合其他方法或工具库,还能进一步提升代码的可维护性和性能。建议读者通过实际项目练习,逐步熟练这一方法的运用,从而在 Java 开发中游刃有余。
通过本文的讲解,希望读者能对 Java substring() 方法
有系统性认识,并能在实际场景中灵活应用。编程之路虽充满挑战,但掌握基础工具的精髓,是迈向专业水平的关键一步。