Java endsWith() 方法(手把手讲解)

更新时间:

💡一则或许对你有用的小广告

欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 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 开发中,字符串操作是编程的核心任务之一。无论是文件路径验证、URL 解析,还是配置文件处理,开发者常常需要快速判断字符串是否以特定字符或子串结尾。此时,Java endsWith() 方法 就像一把精准的“文本裁剪刀”,能够高效完成这类判断任务。本文将从基础到实战,逐步解析这一方法的用法、应用场景及常见问题,帮助开发者在实际项目中灵活运用。


一、Java endsWith() 方法基础解析

1.1 方法定义与语法

endsWith() 是 Java String 类的一个实例方法,用于判断当前字符串是否以指定的后缀子串结尾。其语法如下:

public boolean endsWith(String suffix)  
  • 参数suffix 是需要检查的后缀子串,类型为 String
  • 返回值:返回布尔值 truefalse,表示当前字符串是否以该后缀结尾。

形象比喻
可以将 endsWith() 想象为检查一封邮件是否以“此致敬礼”结尾。只要邮件正文最后出现这句话,方法就返回 true


1.2 基础用法示例

以下代码演示了 endsWith() 的基本用法:

String fileName = "report_2023.pdf";  
boolean isPdf = fileName.endsWith(".pdf");  
System.out.println("是否是 PDF 文件?" + isPdf);  // 输出:true  

1.3 与类似方法的对比

Java 还提供了 startsWith()contains() 方法,它们的用途各有侧重:

  • startsWith():检查字符串是否以指定前缀开头。
  • contains():检查字符串是否包含指定子串(不限位置)。

对比表格
| 方法名 | 用途 | 示例场景 |
|-----------------|--------------------------|--------------------------|
| endsWith() | 检查结尾是否匹配后缀 | 验证文件扩展名(如 .txt)|
| startsWith() | 检查开头是否匹配前缀 | 判断 URL 是否以 http:// 开头 |
| contains() | 检查任意位置是否包含子串 | 检测日志中是否包含 ERROR 标识 |


二、常见应用场景与代码示例

2.1 场景 1:文件扩展名验证

在文件处理中,开发者常需判断文件是否为特定类型。例如:

public static boolean isImageFile(String fileName) {  
    return fileName.toLowerCase()  
            .endsWith(".jpg") ||  
            fileName.toLowerCase()  
            .endsWith(".png");  
}  

// 调用示例  
System.out.println(isImageFile("photo.png"));  // true  
System.out.println(isImageFile("document.doc"));  // false  

注意:通过 toLowerCase() 统一大小写,避免因用户输入 ".PNG" 导致判断失败。


2.2 场景 2:URL 参数处理

在 Web 开发中,可通过 endsWith() 判断 URL 是否需要添加查询参数:

public static String appendQueryParam(String url, String param) {  
    if (!url.endsWith("?")) {  
        url += "?";  
    }  
    return url + param;  
}  

// 调用示例  
String newUrl = appendQueryParam("https://api.com/data", "page=2");  
System.out.println(newUrl);  // 输出:https://api.com/data?page=2  

2.3 场景 3:配置文件解析

在读取配置文件时,可以过滤以特定注释符号结尾的行:

public static List<String> filterComments(List<String> lines) {  
    return lines.stream()  
            .filter(line -> !line.trim().endsWith("//"))  
            .collect(Collectors.toList());  
}  

三、注意事项与进阶技巧

3.1 注意事项

3.1.1 区分大小写

endsWith() 是区分大小写的,例如:

System.out.println("HELLO.TXT".endsWith(".txt"));  // 输出:false  

解决方案:统一转换为小写后再判断:

String lowerCaseName = fileName.toLowerCase();  
boolean isTxt = lowerCaseName.endsWith(".txt");  

3.1.2 空字符串与 null

  • 如果字符串为空(""),endsWith() 仅当后缀也为 "" 时返回 true
  • 若字符串为 null,调用 endsWith() 会抛出 NullPointerException

安全检查示例

public static boolean safeEndsWith(String str, String suffix) {  
    if (str == null) return false;  
    return str.endsWith(suffix);  
}  

3.2 进阶技巧

3.2.1 结合正则表达式

当需要更复杂的匹配规则时,可结合正则表达式:

// 检查字符串是否以数字结尾  
public static boolean isNumericEnding(String text) {  
    return text.matches(".*\\d$");  
}  

3.2.2 批量后缀判断

若需同时检查多个后缀,可使用 Stream 简化代码:

public static boolean endsWithAny(String text, String... suffixes) {  
    return Arrays.stream(suffixes)  
            .anyMatch(text::endsWith);  
}  

// 调用示例  
System.out.println(endsWithAny("report.csv", ".csv", ".xlsx"));  // true  

四、常见问题与解决方案

4.1 问题 1:误判空格或特殊字符

当字符串末尾包含空格时,endsWith() 可能返回意外结果:

String str = "test.pdf  ";  // 末尾有空格  
System.out.println(str.endsWith(".pdf"));  // 输出:false  

解决方法:先用 trim() 去除首尾空格:

str = str.trim();  

4.2 问题 2:多语言字符编码问题

在处理非 ASCII 字符(如中文)时,需确保编码一致:

String fileName = "报告_2023.pdf";  
System.out.println(fileName.endsWith("pdf"));  // 输出:false(需检查编码)  

建议:使用 endsWith() 时,直接传递完整的后缀字符串(如 ".pdf")。


五、性能优化与替代方案

5.1 性能分析

endsWith() 的时间复杂度为 O(n),其中 n 是后缀长度。对于短字符串或少量调用,性能无需担忧;但若需在循环中频繁检查长字符串,可考虑以下优化:

// 优化示例:提前缓存后缀长度  
int suffixLength = suffix.length();  
if (text.length() < suffixLength) {  
    return false;  
}  
return text.substring(text.length() - suffixLength).equals(suffix);  

5.2 替代方法

若需更灵活的匹配(如忽略大小写或正则表达式),可使用 String#matches() 或 Apache Commons Lang 库的 StringUtils.endsWithIgnoreCase()


六、结论

Java endsWith() 方法 是字符串处理中的“瑞士军刀”,尤其在文件操作、URL 处理和配置解析场景中不可或缺。掌握其用法、注意事项及进阶技巧,能显著提升代码的健壮性和可维护性。建议开发者在实际项目中结合具体需求,灵活搭配其他字符串方法,进一步扩展其应用场景。

通过本文的学习,读者应能快速上手 endsWith(),并理解其在 Java 开发中的核心价值。接下来,不妨尝试在自己的项目中实践这些示例,并根据业务需求设计更复杂的字符串处理逻辑!

最新发布