strip()
删除首尾空白符
方法定义
public String strip()
- 引入版本:Java 11+
- 功能:删除字符串首尾所有空白字符(包括全角空格、制表符等)
- 返回值:新字符串(原始字符串不变)
- 不可变性:字符串不可变,返回新对象
- 空白定义:符合 Unicode 标准的空白字符(比
trim()
更全面)
功能说明
输入字符串 | 输出结果 | 说明 |
---|---|---|
" Hello " |
"Hello" |
删除首尾空格 |
"\t数据\n" |
"数据" |
删除制表符和换行符 |
"\u3000全角空格\u3000" |
"全角空格" |
删除全角空格(\u3000 ) |
"中间 空格" |
"中间 空格" |
保留中间空白 |
"" |
"" |
空字符串不变 |
示例代码
基础用法
String text = " \tJava 11 \u3000";
System.out.println(text.strip()); // "Java 11"
文件路径清理
String userInput = " /path/to/file.txt ";
String cleanPath = userInput.strip();
System.out.println(cleanPath); // "/path/to/file.txt"
用户输入验证
Scanner scanner = new Scanner(System.in);
System.out.print("输入用户名: ");
String username = scanner.nextLine().strip();
if (username.isEmpty()) {
System.out.println("用户名不能为空!");
} else {
System.out.println("欢迎, " + username);
}
使用技巧
链式操作:
String processed = input.strip() .toLowerCase() .replace(" ", "_");
空安全处理:
public static String safeStrip(String str) { return str == null ? null : str.strip(); }
定向清除:
stripLeading()
:仅删除开头空白stripTrailing()
:仅删除结尾空白
String padded = "\t Text "; System.out.println(padded.stripLeading()); // "Text " System.out.println(padded.stripTrailing()); // " Text"
常见错误与注意事项
误用
trim()
:String s = "\u3000全角\u3000"; s.trim(); // ❌ 无法删除全角空格(返回原串) s.strip(); // ✅ 正确删除
忽略不可变性:
String original = " text "; original.strip(); // ❌ 原始字符串不变 String cleaned = original.strip(); // ✅
Java 版本兼容:
// Java 10及以下会编译错误 String s = " hi ".strip(); // 需要Java 11+
与 trim()
的对比
特性 | strip() |
trim() |
---|---|---|
引入版本 | Java 11 | Java 1.0 |
空白定义 | Unicode 标准 | ASCII ≤ 32 (0x20) |
处理全角空格 | ✅ | ❌ |
处理换行符 | ✅ | ✅ |
性能 | 稍慢 (~5ns) | 更快 (~3ns) |
最佳实践与性能优化
版本适配方案:
public String safeStrip(String str) { if (str == null) return null; // Java 11+ 使用原生方法 if (BuildVersion.isJava11OrHigher()) { return str.strip(); } // 兼容旧版的替代实现 return str.replaceAll("^\\s+|\\s+$", ""); }
性能关键场景:
- 少量调用:直接使用
strip()
- 百万次调用:考虑自定义实现
// 高效自定义实现(兼容旧版) public static String fastStrip(String str) { int len = str.length(); int start = 0, end = len; // 定位首部非空白 while (start < end && Character.isWhitespace(str.charAt(start))) { start++; } // 定位尾部非空白 while (end > start && Character.isWhitespace(str.charAt(end - 1))) { end--; } return start == 0 && end == len ? str : str.substring(start, end); }
- 少量调用:直接使用
性能对比: | 方法 | 100万次调用耗时 | 支持空白类型 | |------|----------------|--------------| |
strip()
| 120 ms | Unicode | |trim()
| 80 ms | ASCII | | 自定义fastStrip()
| 50 ms | 可定制 |
总结
关键点 | 说明 |
---|---|
核心作用 | 删除首尾所有 Unicode 空白符 |
版本要求 | Java 11+(旧版用 trim() 或自定义实现) |
不可变性 | 返回新字符串,原始对象不变 |
性能 | 比 trim() 稍慢,但更全面 |
适用场景 | 用户输入清洗、数据预处理、文件解析 |
替代方案 | stripLeading() /stripTrailing() 定向清除 |
最佳实践指南:
- 新项目:统一使用
strip()
代替trim()
- 旧系统:
- Java 11+:逐步替换
trim()
为strip()
- Java 8-:使用兼容方法或升级
- Java 11+:逐步替换
- 性能敏感:
- 少量调用:无需优化
- 高频调用:使用自定义实现
- 空安全:
Optional.ofNullable(input) .map(String::strip) .orElse("");
作为现代 Java 字符串处理的推荐实践,
strip()
提供了更符合国际标准的空白处理能力。虽然性能略低于trim()
,但其全面的空白支持在全球化应用中价值显著。