Java的String类无内置首字母大写方法,需手写实现:先判空(null或isEmpty),再用Character.toUpperCase(str.charAt(0)) + str.substring(1),注意避免substring(1, length)越界及国际化问题。

Java里String没有内置首字母大写方法
Java标准库的String类本身不提供类似capitalize()这样的方法,别指望调用str.capitalize()——它根本不存在。想实现首字母大写,得自己动手或借助第三方(比如Apache Commons Lang里的StringUtils.capitalize()),但多数项目并不想引入额外依赖。
手写capitalize()要处理空字符串和null
最常踩的坑是没判空,一遇到null或空串就抛NullPointerException或StringIndexOutOfBoundsException。正确做法是先兜底:
- 输入为
null→ 直接返回null(保持语义一致)或空串(按业务定) - 输入长度为0 → 返回原串(即空串)
- 只对第一个字符调用
Character.toUpperCase(),其余部分用substring(1)拼接
示例代码片段:
public static String capitalize(String str) {
if (str == null || str.isEmpty()) {
return str;
}
return Character.toUpperCase(str.charAt(0)) + str.substring(1);
}
注意substring(1)在单字符字符串下的行为
substring(1)对长度为1的字符串返回空串"",这是安全的,不会报错。但有人误用str.substring(1, str.length()),当str.length() == 1时会触发StringIndexOutOfBoundsException——因为右边界不能小于左边界。
立即学习“Java免费学习笔记(深入)”;
- 永远用
substring(1),不是substring(1, str.length()) - 不要用
toLowerCase()或toUpperCase()全量转换,它们对非ASCII字符(如带重音的法语字母)支持有限,且可能改变原意 - 如果需国际化支持(比如土耳其语i/I规则),必须用
String.toUpperCase(Locale)并传入对应Locale
性能上别在循环里反复拼接字符串
上面示例用了+拼接,在JDK 9+中会被优化成StringBuilder,但若在高频路径(如日志处理、大量文本清洗)中调用,仍建议显式用StringBuilder避免隐式开销:
public static String capitalize(String str) {
if (str == null || str.isEmpty()) return str;
StringBuilder sb = new StringBuilder(str.length());
sb.append(Character.toUpperCase(str.charAt(0)));
if (str.length() > 1) {
sb.append(str, 1, str.length());
}
return sb.toString();
}
真正容易被忽略的是:这个方法只改首字母,不管后面是否小写。比如"JAVA"会变成"JAVA"(首字母J已大写),而不是"Java"。需要后者就得额外加逻辑,但那就不是“首字母大写”,而是“驼峰标准化”了。










