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() 方法对参数有严格限制:

  1. 索引越界:若 beginIndex 小于0、大于字符串长度,或 endIndex 小于 beginIndex,会抛出 StringIndexOutOfBoundsException
  2. 参数类型:参数必须是 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() 重载方法:

  1. 单参数版本substring(int beginIndex),默认截取到字符串末尾。
  2. 双参数版本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() 会生成新字符串对象,频繁操作可能导致内存压力。可改用 StringBuilderCharSequence 接口优化:

// 低效写法:多次调用 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() 方法 有系统性认识,并能在实际场景中灵活应用。编程之路虽充满挑战,但掌握基础工具的精髓,是迈向专业水平的关键一步。

最新发布