作为一名 Java 后端开发程序员,String 是你每天都会频繁使用的类,掌握其常用方法不仅能提升代码质量,还能避免性能陷阱(如频繁拼接导致的内存浪费)。下面我将为你系统性地整理 String 的常用方法,按功能分类,并附上真实开发场景中的示例与详细中文注释,帮助你理解其作用与最佳实践。
✅ String 常用方法总揽(按功能分类)
| 分类 | 方法 | 作用简述 |
|---|---|---|
| 基本属性 | length() | 返回字符串的字符个数 |
isEmpty() | 判断字符串是否为空(长度为0) | |
isBlank() | 判断字符串是否为空白(空或仅含空格、制表符等) | |
| 字符访问 | charAt(int index) | 获取指定索引处的字符 |
codePointAt(int index) | 获取指定索引处的 Unicode 码点(支持 Unicode 扩展字符) | |
| 子串操作 | substring(int beginIndex) | 截取从指定位置到末尾的子串 |
substring(int beginIndex, int endIndex) | 截取指定范围的子串(左闭右开) | |
startsWith(String prefix) | 判断是否以指定前缀开头 | |
endsWith(String suffix) | 判断是否以指定后缀结尾 | |
contains(CharSequence cs) | 判断是否包含指定字符序列 | |
| 查找与索引 | indexOf(String str) | 返回首次出现的索引,未找到返回 -1 |
indexOf(String str, int fromIndex) | 从指定位置开始查找首次出现的索引 | |
lastIndexOf(String str) | 返回最后一次出现的索引 | |
indexOfAny(CharSequence... searchChars) | (Apache Commons Lang) 查找任意一个字符首次出现的位置 | |
| 大小写转换 | toLowerCase() | 转为小写(使用默认本地化规则) |
toLowerCase(Locale locale) | 指定区域设置转小写(推荐国际化场景) | |
toUpperCase() | 转为大写 | |
toUpperCase(Locale locale) | 指定区域设置转大写 | |
| 去除空白 | trim() | 去除首尾 ASCII 空格(' ') |
strip() | 去除首尾所有 Unicode 空白字符(JDK 11+,推荐) | |
stripLeading() / stripTrailing() | 分别去除首部或尾部空白(JDK 11+) | |
| 字符串替换 | replace(CharSequence target, CharSequence replacement) | 替换所有匹配的子串 |
replaceAll(String regex, String replacement) | 使用正则表达式替换 | |
replaceFirst(String regex, String replacement) | 仅替换第一个匹配项 | |
| 分割与连接 | split(String regex) | 按正则表达式拆分为字符串数组 |
split(String regex, int limit) | 按正则拆分,限制返回数组长度 | |
join(CharSequence delimiter, CharSequence... elements) | 将多个字符串用分隔符连接 | |
String.join(delimiter, iterable) | 连接集合中的元素(推荐用于 List) | |
| 格式化与比较 | equals(Object obj) | 严格相等比较(区分大小写) |
equalsIgnoreCase(String anotherString) | 忽略大小写比较 | |
compareTo(String anotherString) | 字典序比较,返回整数差值 | |
compareToIgnoreCase(String str) | 忽略大小写的字典序比较 | |
format(String format, Object... args) | 格式化字符串(类似 printf) | |
valueOf(primitive) | 将基本类型转为 String(如 valueOf(123)) | |
| 其他实用方法 | concat(String str) | 拼接字符串(不推荐,性能差) |
repeat(int count) | 重复字符串(JDK 11+) | |
transform(Function<String, R> f) | 转换字符串为其他类型(JDK 15+) | |
lines() | 将字符串按行分割为 Stream(JDK 11+) |
💡 重要提示:
String是不可变对象(immutable),所有修改方法都会返回新对象,原字符串不变。- 频繁拼接字符串应使用
StringBuilder或StringJoiner,避免性能问题。trim()只能去掉 ASCII 空格(\u0020),而strip()支持 Unicode 全角空格、零宽空格等,推荐在 JDK 11+ 中使用strip()。
✅ 实际开发场景示例(带详细中文注释)
示例 1:用户输入清洗与校验(Web 请求参数处理)
import java.util.Arrays;
import java.util.List;
public class StringCleanExample {
public static void main(String[] args) {
// 模拟从 HTTP 请求中获取的用户输入(可能包含多余空格、换行、制表符)
String userInput = " \u00A0 张三\t \n ";
// ✅ 推荐:使用 strip() 清洗 Unicode 空白字符(JDK 11+)
String cleanedName = userInput.strip();
System.out.println("原始长度: " + userInput.length()); // 输出:14
System.out.println("清洗后长度: " + cleanedName.length()); // 输出:3
System.out.println("清洗后内容: '" + cleanedName + "'"); // 输出:'张三'
// ✅ 判断是否为空或仅含空白(推荐写法)
if (cleanedName.isBlank()) {
System.out.println("用户姓名为空或仅含空白字符,需提示输入!");
} else {
System.out.println("用户姓名有效:" + cleanedName);
}
// ✅ 检查是否以特定前缀开头(如手机号校验)
String phone = " 138-0013-8000 ";
if (phone.strip().startsWith("138")) {
System.out.println("该手机号属于中国移动");
}
// ✅ 按分隔符拆分多个标签(如用户兴趣标签)
String tagsStr = "编程,Java,后端, Spring, ,数据库, ";
List<String> tags = Arrays.stream(tagsStr.split(","))
.map(String::strip) // 清洗每个元素
.filter(tag -> !tag.isEmpty()) // 过滤空字符串
.toList(); // JDK 16+ 支持,否则用 collect(Collectors.toList())
System.out.println("有效标签列表:" + tags);
// 输出:[编程, Java, 后端, Spring, 数据库]
}
}
📌 应用场景:用户注册、表单提交、API 参数校验、日志解析等场景中,前端传来的字符串往往包含不可控空白,必须清洗。
示例 2:字符串替换与格式化(日志/模板生成)
public class StringFormatAndReplaceExample {
public static void main(String[] args) {
// ✅ 使用 format 格式化日志消息(替代拼接,更清晰)
String userId = "U1001";
String action = "登录";
String logMessage = String.format("[%s] 用户 %s 执行了 %s 操作",
java.time.LocalDateTime.now(),
userId,
action);
System.out.println(logMessage);
// 输出:[2025-10-12T10:30:00] 用户 U1001 执行了 登录 操作
// ✅ 替换模板中的占位符(如邮件模板、SQL 日志)
String template = "尊敬的{username},您于{time}成功登录系统。";
String finalMsg = template
.replace("{username}", "李四")
.replace("{time}", "2025-10-12 10:30:00");
System.out.println(finalMsg);
// 输出:尊敬的李四,您于2025-10-12 10:30:00成功登录系统。
// ✅ 使用正则替换敏感信息(如脱敏手机号)
String phone = "13800138000";
String maskedPhone = phone.replaceAll("(\\d{3})\\d{4}(\\d{4})", "$1****$2");
System.out.println("脱敏后手机号:" + maskedPhone); // 输出:138****8000
// ✅ 替换 URL 中的参数(如开发环境替换为生产环境)
String apiUrl = "http://dev-api.example.com/v1/user/123";
String prodUrl = apiUrl.replace("dev-api", "prod-api");
System.out.println("生产环境地址:" + prodUrl);
// 输出:http://prod-api.example.com/v1/user/123
}
}
📌 应用场景:日志记录、邮件模板、API 路径动态替换、数据脱敏(GDPR/个人信息保护)、配置文件模板渲染。
示例 3:字符串比较与排序(业务逻辑判断)
import java.util.*;
public class StringComparisonExample {
public static void main(String[] args) {
List<String> names = Arrays.asList("zhang", "Zhang", "Li", "li", "wang", "Wang");
// ✅ 严格比较:区分大小写(用于精确匹配)
boolean exactMatch = "Zhang".equals("zhang");
System.out.println("严格相等:" + exactMatch); // false
// ✅ 忽略大小写比较(用于用户名登录、配置项匹配)
boolean caseInsensitiveMatch = "Zhang".equalsIgnoreCase("zhang");
System.out.println("忽略大小写相等:" + caseInsensitiveMatch); // true
// ✅ 按字典序排序(自然顺序)
List<String> sortedNames = names.stream()
.sorted() // 默认按 Unicode 排序
.toList();
System.out.println("自然排序:" + sortedNames);
// 输出:[Li, Wang, Zhang, li, wang, zhang]
// ✅ 忽略大小写排序(推荐用于用户列表展示)
List<String> caseInsensitiveSorted = names.stream()
.sorted(String.CASE_INSENSITIVE_ORDER)
.toList();
System.out.println("忽略大小写排序:" + caseInsensitiveSorted);
// 输出:[Li, li, Wang, wang, Zhang, zhang]
// ✅ 比较两个字符串的字典序差异(用于排序自定义逻辑)
int cmp = "apple".compareTo("application");
System.out.println("'apple' 与 'application' 比较结果:" + cmp); // 负数,表示 apple < application
}
}
📌 应用场景:用户登录名匹配、配置项比对、字典排序展示、权限组名称校验。
示例 4:字符串连接与拆分(处理 CSV / 日志行)
import java.util.Arrays;
import java.util.List;
public class StringSplitJoinExample {
public static void main(String[] args) {
// ✅ 拆分 CSV 数据(注意:实际生产中建议使用 Apache Commons CSV 或 Jackson)
String csvLine = "张三,25,工程师,北京";
String[] fields = csvLine.split(",");
System.out.println("姓名:" + fields[0] + ",年龄:" + fields[1]);
// ✅ 使用 limit 控制拆分数量(防止过多字段导致数组过大)
String logLine = "ERROR 2025-10-12 10:30:00 [UserService] 用户登录失败:密码错误";
String[] logParts = logLine.split(" ", 4); // 只拆前3个空格,保留后面为完整消息
System.out.println("日志级别:" + logParts[0]);
System.out.println("完整消息:" + logParts[3]); // 包含完整错误信息
// ✅ 使用 String.join() 连接集合(推荐写法)
List<String> roles = Arrays.asList("ROLE_ADMIN", "ROLE_USER", "ROLE_AUDIT");
String roleString = String.join(",", roles);
System.out.println("用户角色:" + roleString);
// 输出:ROLE_ADMIN,ROLE_USER,ROLE_AUDIT
// ✅ JDK 11+:按行分割为 Stream(处理多行配置)
String multiLineConfig = "host=localhost\nport=8080\nssl=true";
multiLineConfig.lines()
.filter(line -> !line.trim().isEmpty())
.map(line -> line.split("=", 2))
.forEach(parts -> System.out.println(parts[0] + " -> " + parts[1]));
// 输出:
// host -> localhost
// port -> 8080
// ssl -> true
}
}
📌 应用场景:解析配置文件、处理日志文件、导入导出 CSV、构建 SQL IN 条件。
✅ 最佳实践总结(建议收藏)
| 场景 | 推荐方法 | 禁用方法 | 原因 |
|---|---|---|---|
| 清洗用户输入 | strip() | trim() | strip() 支持 Unicode 空白,更安全 |
| 字符串拼接(循环中) | StringBuilder | + 或 concat() | String 不可变,每次拼接创建新对象,性能差 |
| 比较字符串相等 | equals() | == | == 比较引用,不是内容 |
| 忽略大小写比较 | equalsIgnoreCase() | toLowerCase().equals() | 更高效,避免创建临时对象 |
| 替换敏感信息 | replaceAll(regex, "***") | 手动索引替换 | 正则更灵活,不易出错 |
| 连接多个字符串 | String.join(delimiter, list) | 手动拼接 | 代码简洁,性能好 |
| 格式化输出 | String.format() | + 拼接 | 可读性强,支持国际化占位符 |
✅ 下一步学习建议
- 掌握
StringBuilder与StringJoiner:避免在循环中使用+拼接。 - 了解正则表达式基础:
replaceAll、split等方法依赖正则,推荐学习Pattern和Matcher。 - 学习
java.util.regex.Pattern:用于复杂文本匹配与提取(如提取邮箱、URL)。 - 使用工具库:如 Apache Commons Lang 的
StringUtils,提供isEmpty,isBlank,join,substringBetween等更健壮的方法。

被折叠的 条评论
为什么被折叠?



