String是Java中使用频率最高的类之一,从控制台输出到数据库查询语句的拼接,几乎处处都能见到它的身影。虽然人人都会用字符串,但真正熟悉String类完整方法集的人并不算多,很多人写了几年代码,遇到判断包含关系还是习惯手写for循环逐字符比较。把String类的常用方法梳理清楚,不仅能让代码更短,还能避免一些隐蔽的性能和逻辑问题。本文按照功能类别逐一介绍这些方法,并配上可以直接复制运行的示例代码。

基础操作:长度、字符访问与拼接
最基础的一组方法是获取字符串信息和访问其中的字符。length()返回字符串中字符的个数,注意它和数组的length属性不同,方法后面是有括号的。charAt(int index)返回指定位置的字符,索引从0开始,如果传入的索引越界会抛出StringIndexOutOfBoundsException。indexOf(String str)用于查找子字符串第一次出现的位置,找不到返回-1,它还有带起始位置的重载版本indexOf(String str, int fromIndex),以及对应的lastIndexOf方法从后往前查找。
拼接操作可以使用concat()方法,但更常见的写法是直接用加号。需要提醒的是,字符串在Java中是不可变的,每次拼接都会产生新的String对象,在循环里反复用加号拼接会有明显的性能损耗。下面这段代码演示了这些基础方法的用法:
String str = "Hello, Java";
System.out.println(str.length()); // 输出 11
System.out.println(str.charAt(4)); // 输出 o
System.out.println(str.indexOf("Java")); // 输出 7
System.out.println(str.indexOf("l")); // 输出 2,第一次出现的位置
System.out.println(str.lastIndexOf("l"));// 输出 3,从后往前找
System.out.println(str.concat("!")); // 输出 Hello, Java!
System.out.println(str + "!"); // 等价写法
这一组方法看似简单,却是很多复杂逻辑的基石。比如统计某个字符出现的次数,用indexOf加循环配合就能优雅地实现,完全不需要手动逐个字符比较。另外,isEmpty()判断字符串是否为空串,isBlank()(Java 11新增)判断是否只包含空白字符,这两个方法在参数校验时非常实用,可以替代str.equals("")这种别扭的写法。
比较、判断与格式转换:equals、substring和replace
字符串比较是初学者最容易踩坑的地方。equals()比较的是字符串的内容,而双等号比较的是对象引用。由于字符串常量池的存在,两个字面量字符串用双等号可能返回true,但这属于编译器的优化行为,一旦有一方是运行时拼接或new出来的对象,双等号就会给出错误结果。永远记住:判断字符串内容是否相同,用equals();忽略大小写比较,用equalsIgnoreCase()。compareTo()则按字典序比较,返回差值,常用于排序场景。
截取和替换是字符串处理的核心操作。substring(int beginIndex)从指定位置截取到末尾,substring(int beginIndex, int endIndex)截取左闭右开区间,也就是包含beginIndex位置的字符但不包含endIndex位置的字符。replace(char oldChar, char newChar)替换所有匹配的字符,replace(CharSequence target, CharSequence replacement)替换所有匹配的字符串序列,而replaceAll(String regex, String replacement)的第一个参数是正则表达式,功能更强但要小心特殊字符转义问题。
String s = "Hello World";
// 内容比较
System.out.println(s.equals("hello world")); // false
System.out.println(s.equalsIgnoreCase("hello world")); // true
// 截取
System.out.println(s.substring(6)); // World
System.out.println(s.substring(0, 5)); // Hello
// 替换
System.out.println(s.replace('o', '0')); // Hell0 W0rld
System.out.println(s.replace("World", "Java")); // Hello Java
System.out.println("a1b2c3".replaceAll("\\d", "*")); // a*b*c*
还有一类判断方法在业务代码里出场率极高:startsWith()和endsWith()判断前后缀,常用于文件扩展名校验;contains()判断是否包含子串,比indexOf的返回值判断更直观;matches(String regex)判断整串是否匹配正则,适合做格式校验,比如校验手机号或邮箱格式。这些方法返回boolean值,直接放进if条件里即可,代码可读性比手写循环高得多。
分割、去空格与格式化:split、trim和String.format
split(String regex)按分隔符把字符串拆成数组,是解析CSV数据、处理URL参数的利器。要注意它接收的同样是正则表达式,如果分隔符是点号、竖线这类正则特殊字符,必须转义,例如按点分割IP地址要写成split("\\.")而不是split("."),后者会返回一个只含原字符串的数组,因为点在正则里匹配任意字符。trim()去掉字符串首尾的空白字符(限定在ASCII空格范围内),Java 11之后可以用strip(),它基于Unicode标准,能处理全角空格等更多空白字符。
toLowerCase()和toUpperCase()做大小写转换,toCharArray()把字符串转成字符数组,方便逐字符处理。拼接多个字段时,String.format()比连续用加号更清晰,也方便控制数字的位数和精度。综合示例如下:
String data = "Tom, Jerry, Spike";
// 分割
String[] names = data.split(",\\s*");
for (String name : names) {
System.out.println(name); // 依次输出 Tom Jerry Spike
}
// 去空格与大小写
String messy = " Hello Java ";
System.out.println(messy.trim().toLowerCase()); // hello java
// 格式化
String result = String.format("姓名:%s, 年龄:%d", "张三", 25);
System.out.println(result); // 姓名:张三, 年龄:25
// 字符数组
char[] chars = "abc".toCharArray();
最后谈一个绕不开的话题:字符串不可变性与性能。String对象一旦创建,内容就无法修改,所有看起来像修改字符串的方法,底层都是新建了一个对象返回。这在单次操作时没有问题,但在循环中拼接几千次字符串时,会产生大量中间对象,此时应该改用StringBuilder的append()方法,它在内部维护可变的字符数组,拼接完毕再调用toString()一次性转换。单线程场景用StringBuilder,多线程并发拼接用线程安全的StringBuffer,日常开发中前者足够。掌握好这些方法的适用边界,写出来的字符串处理代码会既简洁又高效。
Java String类字符串处理String方法修改时间:2026-09-10 10:09:07