在 Java 开发中,查找字符串中字符或子串
最后一次出现的位置是高频需求(如解析文件路径、提取后缀名、处理 URL 等场景)。核心依赖
String 类的
lastIndexOf() 方法,该方法提供多种重载形式,适配不同查找场景。本文通过实例详解所有用法、返回规则及实际应用场景。
String 类提供 4 个 lastIndexOf() 重载方法,均返回目标字符 / 子串在原字符串中最后一次出现的索引(索引从 0 开始);若未找到,返回 -1。
- 索引从 0 开始(如 "abc" 中 'a' 索引为 0,'c' 为 2)。
fromIndex 超出范围时:
- 若
fromIndex >= 字符串长度:等效于从字符串末尾开始查找。
- 若
fromIndex < 0:等效于从索引 0 开始查找(即全串查找,但仍返回最后一次出现位置)。
- 查找空字符串
"" 时,返回字符串的长度(如 "test".lastIndexOf ("") → 4)。
已知字符串 str = "Hello, Java! Java is easy.",查找字符 'a' 和 '!' 最后一次出现的位置。
public class LastIndexOfDemo {public static void main(String[] args) {String str = "Hello, Java! Java is easy.";
在上述字符串中,查找子串 "Java" 和 "is" 最后一次出现的位置。
public class LastIndexOfSubstringDemo {public static void main(String[] args) {String str = "Hello, Java! Java is easy.";
在字符串 str = "abacadaeaf" 中,从索引 8 开始向前查找字符 'a',从索引 5 开始向前查找子串 "ada"。
public class LastIndexOfFromIndexDemo {public static void main(String[] args) {String str = "abacadaeaf";
给定文件路径字符串,通过 lastIndexOf() 提取文件名和后缀名(开发中常见场景)。
public class FilePathParseDemo {public static void main(String[] args) {String filePath = "D:/document/project/java/StringDemo.java";
-
空值与空字符串处理:
- 传入
null 作为子串(如 str.lastIndexOf(null)):抛出 NullPointerException,需提前判空。
- 传入空字符串
"":返回字符串长度(如 "test".lastIndexOf("") → 4),这是 Java 的设计规则,无需特殊处理。
-
区分大小写:
lastIndexOf() 是大小写敏感的(如 "Java".lastIndexOf("java") → -1)。
- 若需忽略大小写,需先将原字符串和目标串统一转为大写或小写(如
str.toLowerCase().lastIndexOf("java"))。
-
索引越界问题:
- 提取子串时(如
substring()),需先判断 lastIndexOf() 返回值是否为 -1(避免未找到目标时导致 StringIndexOutOfBoundsException)。
- 示例:
-
Unicode 字符查找:
lastIndexOf(int ch) 中 ch 是 Unicode 编码,可直接传入字符(如 '中')或对应的 Unicode 数值(如 '\u4e2d')。
- 示例:
"中国,中国".lastIndexOf('中') → 3(索引 0 和 3 均为 ' 中 ',返回最后一个)。
lastIndexOf() 是 Java 处理字符串的核心方法,核心用途是从后向前查找字符 / 子串的位置,配合 substring() 可实现文件路径解析、后缀提取、数据清洗等实际需求。使用时需注意:
- 未找到目标返回
-1,需提前判断避免索引越界;
- 区分大小写,按需统一转换;
- 处理
null 参数,避免空指针异常。