Java 中主要有与 replace 相关的四个方法,它们分别位于 String 类和 StringBuilder/StringBuffer 类中,理解它们的区别和适用场景非常重要。

核心概览
| 方法 | 所属类 | 是否改变原对象 | 功能描述 | 特点 |
|---|---|---|---|---|
replace(char old, char new) |
String |
否 (String不可变) | 替换所有匹配的旧字符为新字符 | 基于字符 |
replace(CharSequence old, CharSequence new) |
String |
否 (String不可变) | 替换所有匹配的旧子串为新子串 | 基于序列,最常用 |
replaceFirst(String regex, String replacement) |
String |
否 (String不可变) | 替换第一个匹配正则表达式的子串 | 基于正则表达式 |
replaceAll(String regex, String replacement) |
String |
否 (String不可变) | 替换所有匹配正则表达式的子串 | 基于正则表达式 |
replace(char old, char new) |
StringBuilder/StringBuffer |
是 (可变) | 替换所有匹配的旧字符为新字符 | 高效,直接修改 |
replace(int start, int end, String str) |
StringBuilder/StringBuffer |
是 (可变) | 替换指定索引范围内的子串 | 功能强大,范围替换 |
String 类中的 replace 方法
String 对象在 Java 中是不可变的,这意味着任何对 String 的修改操作(包括 replace)都不会改变原始字符串,而是会返回一个新的 String 对象。
1. replace(char oldChar, char newChar)
- 功能:将字符串中所有的
oldChar字符替换为newChar字符。 - 参数:
oldChar: 需要被替换的旧字符。newChar: 用于替换的新字符。
- 返回值:一个新的
String对象。
示例代码:
public class StringReplaceExample {
public static void main(String[] args) {
String str = "hello world, hello java, hello everyone";
// 将所有的 'l' 替换为 'p'
String newStr = str.replace('l', 'p');
System.out.println("原始字符串: " + str); // 输出: hello world, hello java, hello everyone
System.out.println("替换后字符串: " + newStr); // 输出: hepwo worpd, hep java, hep everyone
}
}
2. replace(CharSequence target, CharSequence replacement)
这是最常用、最强大的 replace 方法之一。
- 功能:将字符串中所有的
target子串(子序列)替换为replacement子串。 - 参数:
target: 需要被替换的旧子串。CharSequence是String、StringBuilder等的接口,所以可以直接传字符串。replacement: 用于替换的新子串。
- 返回值:一个新的
String对象。
示例代码:

public class StringReplaceSequenceExample {
public static void main(String[] args) {
String str = "I like Java, and I like Python.";
// 将所有的 "like" 替换为 "love"
String newStr = str.replace("like", "love");
System.out.println("原始字符串: " + str); // 输出: I like Java, and I like Python.
System.out.println("替换后字符串: " + newStr); // 输出: I love Java, and I love Python.
}
}
注意:这个方法是区分大小写的。
String str = "Hello World";
// str.replace("hello", "hi"); // 这行代码不会做任何事,因为 "hello" 和 "Hello" 不匹配
System.out.println(str.replace("Hello", "hi")); // 输出: hi World
String 类中的基于正则表达式的 replace 方法
这两个方法功能相似,但匹配规则不同,它们都使用正则表达式。
1. replaceAll(String regex, String replacement)
- 功能:使用给定的正则表达式
regex去匹配字符串,并将所有匹配到的子串替换为replacement。 - 参数:
regex: 正则表达式。replacement: 替换的字符串。
示例代码:
public class ReplaceAllExample {
public static void main(String[] args) {
String str = "abc123def456ghi";
// 使用正则表达式 \\d+ 匹配一个或多个数字
String newStr = str.replaceAll("\\d+", "-NUM-");
System.out.println("原始字符串: " + str); // 输出: abc123def456ghi
System.out.println("替换后字符串: " + newStr); // 输出: abc-NUM-def-NUM-ghi
}
}
2. replaceFirst(String regex, String replacement)
- 功能:与
replaceAll类似,但它只替换第一个匹配到的子串。 - 参数:同上。
示例代码:

public class ReplaceFirstExample {
public static void main(String[] args) {
String str = "apple orange apple banana";
// 只替换第一个 "apple"
String newStr = str.replaceFirst("apple", "grape");
System.out.println("原始字符串: " + str); // 输出: apple orange apple banana
System.out.println("替换后字符串: " + newStr); // 输出: grape orange apple banana
}
}
StringBuilder / StringBuffer 类中的 replace 方法
StringBuilder 和 StringBuffer 是可变的,它们的 replace 方法会直接修改对象本身,并返回对象自身的引用(通常可以忽略返回值)。
1. replace(int start, int end, String str)
- 功能:删除从
start到end-1索引的子串,并将str插入到start位置。 - 参数:
start: 开始替换的索引(包含)。end: 结束替换的索引(不包含)。str: 用于替换的新字符串。
- 返回值:修改后的
StringBuilder或StringBuffer对象本身。
示例代码:
public class StringBuilderReplaceExample {
public static void main(String[] args) {
StringBuilder sb = new StringBuilder("Hello World");
// 替换索引 6 到 11 的子串(即 "World")为 "Java"
// 注意:索引从0开始,"World" 的索引是 6, 7, 8, 9, 10
sb.replace(6, 11, "Java");
System.out.println("修改后的 StringBuilder 内容: " + sb); // 输出: Hello Java
}
}
2. replace(char oldChar, char newChar)
- 功能:与
String版本功能相同,替换所有匹配的字符。 - 关键区别:直接修改原对象,而不是创建新对象。
示例代码:
public class StringBuilderReplaceCharExample {
public static void main(String[] args) {
StringBuilder sb = new StringBuilder("hello world");
// 将所有的 'l' 替换为 'p'
sb.replace('l', 'p');
System.out.println("修改后的 StringBuilder 内容: " + sb); // 输出: hepwo worpd
}
}
总结与最佳实践
-
选择哪个类?
- 如果你的字符串内容很少,或者需要频繁地拼接、修改,并且最终结果只需要一个字符串,优先使用
String。 - 如果你需要在循环中进行大量的字符串拼接或修改操作,为了性能,应该使用
StringBuilder(在单线程中)或StringBuffer(在多线程中)。
- 如果你的字符串内容很少,或者需要频繁地拼接、修改,并且最终结果只需要一个字符串,优先使用
-
选择哪个
replace方法?- 简单字符替换:
String->str.replace('a', 'b')StringBuilder->sb.replace('a', 'b')
- 固定子串替换(不涉及正则表达式,如 "apple" -> "orange"):
- 强烈推荐
str.replace("apple", "orange"),这是最清晰、最不容易出错的方式。
- 强烈推荐
- 复杂模式替换(如删除所有数字、替换特定格式的文本等):
- 使用
str.replaceAll()或str.replaceFirst(),并编写正确的正则表达式。
- 使用
- 简单字符替换:
-
重要提醒:正则表达式中的特殊字符
- 当你使用
replaceAll或replaceFirst时,replacement参数中的 符号有特殊含义,它代表分组引用(如$1代表第一个捕获组)。 - 如果你想在替换文本中包含一个字面意义上的 符号,你需要用
\\进行转义,即\$。
- 当你使用
示例:
String text = "100 dollars, 200 euros";
// 错误写法:$ 在这里会被解释为分组引用,但正则表达式里没有分组
// text.replaceAll("\\d+", "$"); // 会抛出异常: IllegalArgumentException: No group 1
// 正确写法:对 $ 进行转义
String newText = text.replaceAll("\\d+", "\\$");
System.out.println(newText); // 输出: $ dollars, $ euros
希望这份详细的解释能帮助你完全理解 Java 中 replace 的用法!
