java中string不可变,因底层用final char[]存储且类为final,所有“修改”方法均返回新对象;频繁修改应使用stringbuilder或stringbuffer。

Java 中的 String 是不可变的,这意味着一旦创建,它的内容就不能被修改。所谓“修改 String”,实际是创建一个新 String 对象,再让引用指向它。
为什么不能直接修改 String 内容
String 底层用 final char[] 存储字符,且类本身被声明为 final,所有涉及“改变”的方法(如 substring、toUpperCase、replace)都返回新对象,原对象保持不变。例如:
// 以下代码不会改变 s 的内容,只是让 s 指向新字符串
String s = "hello";
s = s.toUpperCase(); // s 现在是 "HELLO",但原来的 "hello" 对象未被改动
常用替代方案:根据场景选对工具
-
拼接少量字符串:直接用
+或+=(编译器会自动优化为 StringBuilder) -
频繁修改或构建字符串:用
StringBuilder(单线程)或StringBuffer(线程安全) -
需要格式化或替换特定模式:用
String.format()、replace()、replaceAll()等,注意它们都返回新 String -
处理大量文本或需随机访问字符:可临时转为
char[]修改,再构造新 String(如new String(charArray))
典型误区与正确写法对比
// ❌ 错误:以为 replace 修改了原字符串
String s = "abc";
s.replace('a', 'x'); // 返回 "xbc",但 s 仍是 "abc"
System.out.println(s); // 输出 "abc"
// ✅ 正确:把返回值重新赋值
String s = "abc";
s = s.replace('a', 'x'); // s 现在是 "xbc"
// ✅ 需要多次追加时,用 StringBuilder 更高效
StringBuilder sb = new StringBuilder("hello");
sb.append(" ").append("world").append("!");
String result = sb.toString(); // "hello world!"
小结:不可变不是限制,而是设计选择
String 不可变保障了线程安全、可作为 HashMap 键、提升字符串池效率。所谓“修改”,本质是用新对象替代旧引用。只要理解这个机制,配合 StringBuilder 或恰当的 String 方法,就能自然写出清晰、高效的代码。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











