应优先使用 startsWith() 和 endsWith(),但需结合业务规则预处理:声明合法前缀/后缀集合、统一大小写与空格处理、避免误用 contains()、封装为可复用工具方法。

直接用 startsWith() 和 endsWith() 即可,但要贴合业务规则,关键不在方法本身,而在调用前的预处理和判断逻辑设计。
明确合法前缀/后缀集合
业务规则通常限定几个固定值,比如协议头只允许 "http://"、"https://"、"ws://"、"wss://"。建议用不可变集合声明:
private static final Set<String> VALID_PROTOCOLS = Set.of("http://", "https://", "ws://", "wss://");- 校验时遍历或用
stream().anyMatch(),避免硬编码多个||判断 - 后缀同理,如文件类型只接受
".jpg"、".png"、".pdf"
统一大小写与空白处理
用户输入常含大小写混用或首尾空格,而 startsWith() 区分大小写且不自动 trim:
- 先调用
input.trim().toLowerCase()再判断,适用于协议、扩展名等不区分大小写的场景 - 若业务强制要求大小写敏感(如 API token 前缀
"Bearer "),则跳过转小写,但需在注释中明确说明 - 注意:空字符串调用
startsWith("")返回true,所以务必先判空或非空白
避免 contains() 引发的逻辑污染
不要用 contains() 替代 startsWith() 或 endsWith(),否则会误判中缀为前缀/后缀:
立即学习“Java免费学习笔记(深入)”;
- 例如
"abcabc".contains("abc")是true,但它既不是前缀也不是后缀(除非你额外检查位置) - 正确做法是三者独立判断:
str.startsWith(prefix)、str.endsWith(suffix)、!str.startsWith(prefix) && !str.endsWith(suffix) && str.contains(infix) - 如果需忽略大小写又不想创建新字符串,可用
regionMatches(false, 0, prefix, 0, prefix.length())
封装成可复用的工具方法
把校验逻辑收拢,提升可读性和可维护性:
- 例如:
UrlValidator.isHttpsUrl(String url)内部做url != null && url.trim().toLowerCase().startsWith("https://") - 支持传入多个前缀:
StringUtils.startsWithAny(str, "http://", "https://") - 对 null 或空白字符串返回
false,而不是抛NullPointerException


















