replace()
替换所有指定字符
方法定义
// 替换单个字符
public String replace(char oldChar, char newChar)
// 替换字符序列(字符串)
public String replace(CharSequence target, CharSequence replacement)
功能说明
- 全局替换:替换字符串中所有匹配的字符或子串
- 创建新字符串:字符串不可变,返回新字符串对象
- 区分大小写:替换操作大小写敏感
- 特殊场景:
- 无匹配项时返回原字符串
- 替换空字符串(
""
)时直接插入新内容 - 新内容为
null
时抛出NullPointerException
示例代码
public class ReplaceDemo {
public static void main(String[] args) {
// 字符替换
String text = "apple orange apple";
System.out.println(text.replace('a', 'A'));
// 输出: "Apple orAnge Apple"
// 字符串替换
System.out.println(text.replace("apple", "banana"));
// 输出: "banana orange banana"
// 特殊字符处理
String data = "1\t2\t3";
System.out.println(data.replace('\t', ','));
// 输出: "1,2,3"
// 无匹配项
System.out.println("hello".replace('z', 'X'));
// 输出: "hello"(原字符串)
// 空目标处理
System.out.println("java".replace("", "-"));
// 输出: "-j-a-v-a-"
}
}
使用技巧
数据清洗
String phone = "(123) 456-7890"; String clean = phone.replace("(", "") .replace(")", "") .replace(" ", "") .replace("-", ""); // 结果: "1234567890"
模板填充
String template = "Hello {name}, your code is {code}"; String message = template.replace("{name}", "Alice") .replace("{code}", "ABC123");
多字符替换链
String output = input.replace('&', "&") .replace('<', "<") .replace('>', ">");
正则表达式预处理
// 替换数字为# "User123".replaceAll("\\d", "#"); // 正则方法 // 等效replace操作: "User123".replace("0","#").replace("1","#")... // 繁琐
常见错误
忽略返回值
String s = "hello"; s.replace('e', 'E'); // 错误!未接收返回值 System.out.println(s); // 仍输出"hello"
混淆
replace
和replaceAll
// 错误:期待替换所有点号,实际只替换第一个 "a.b.c".replace(".", "-"); // 输出"a-b-c"(正确) // 错误使用replaceAll(需要转义): "a.b.c".replaceAll(".", "-"); // 输出"-----"(.是正则通配符)
空指针异常
String replacement = null; "text".replace("e", replacement); // 抛出NullPointerException
注意事项
性能特性
- 单字符替换:O(n) 时间复杂度,直接遍历
- 字符串替换:使用朴素字符串匹配,最坏 O(n*m)(n=原字符串长度,m=目标长度)
- 大量替换时考虑
StringBuilder
:StringBuilder sb = new StringBuilder(); for (char c : str.toCharArray()) { sb.append(c == oldChar ? newChar : c); } return sb.toString();
特殊字符处理
- Unicode 字符完全支持
- 换行符(
\n
)、制表符(\t
)等可被替换
"line1\nline2".replace('\n', ' '); // "line1 line2"
不可变性原则
String original = "immutable"; String modified = original.replace('i', 'I'); // original仍为"immutable",modified为"Immutable"
最佳实践与性能优化
批量替换优化
// 高效多字符替换 public static String multiReplace(String input, Map<Character, Character> map) { char[] chars = input.toCharArray(); for (int i = 0; i < chars.length; i++) { Character replacement = map.get(chars[i]); if (replacement != null) { chars[i] = replacement; } } return new String(chars); }
长字符串处理
- 超过1MB的字符串避免链式
replace()
- 改用
StringBuilder
单次遍历:StringBuilder sb = new StringBuilder(input); for (int i = 0; i < sb.length(); i++) { if (sb.charAt(i) == oldChar) { sb.setCharAt(i, newChar); } }
- 超过1MB的字符串避免链式
字符串替换选择策略 | 场景 | 推荐方法 | |------|----------| | 单字符替换 |
replace(char, char)
| | 固定字符串替换 |replace(CharSequence, CharSequence)
| | 模式匹配替换 |replaceAll()
/replaceFirst()
| | 大量不同字符替换 | 自定义StringBuilder
遍历 |
总结
关键点 | 说明 |
---|---|
核心功能 | 全局替换字符或子串 |
返回值 | 新字符串(原字符串不变) |
时间复杂度 | 单字符: O(n), 字符串: 最坏 O(n*m) |
大小写处理 | 区分大小写 |
空指针风险 | 替换内容为 null 时抛出 NPE |
适用场景 | 数据清洗、模板填充、转义处理 |
实践建议:
✅ 简单替换优先使用
replace()
而非正则方法
✅ 操作后必须接收返回值(字符串不可变)
✅ 超长字符串使用StringBuilder
优化性能
❌ 不要用于复杂模式匹配(用replaceAll()
)
❌ 避免在循环中链式调用(创建临时对象)
性能对比:
// 10万次替换测试(JDK17)
String str = "a".repeat(1000);
// 方法1: replace()
time: 15ms (单字符替换)
time: 220ms (5字符子串替换)
// 方法2: StringBuilder
time: 5ms (预分配优化)
最终提示:
Java 15+ 的
String.formatted()
可替代部分模板替换场景:"Hello %s, code: %s".formatted("Alice", "ABC123");