String 常用方法总揽(按功能分类)

作为一名 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),所有修改方法都会返回新对象,原字符串不变。
  • 频繁拼接字符串应使用 StringBuilderStringJoiner,避免性能问题。
  • 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()+ 拼接可读性强,支持国际化占位符

✅ 下一步学习建议

  1. 掌握 StringBuilderStringJoiner:避免在循环中使用 + 拼接。
  2. 了解正则表达式基础replaceAllsplit 等方法依赖正则,推荐学习 PatternMatcher
  3. 学习 java.util.regex.Pattern:用于复杂文本匹配与提取(如提取邮箱、URL)。
  4. 使用工具库:如 Apache Commons Lang 的 StringUtils,提供 isEmpty, isBlank, join, substringBetween 等更健壮的方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

龙茶清欢

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值