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(),但其全面的空白支持在全球化应用中价值显著。