Java中String内容不变的理解,混淆细节梳理。
1、如何理解Java中提到的String内容不可改变,但是为什么如下代码却能执行?
String name = "kungfu"
name = "bruce lee"
在 Java 中,String 对象的不可变性(immutability)是指一旦创建,String 对象的内容就不能修改。但这并不意味着变量不能重新指向新的 String 对象。
你提到的代码能够执行,因为它实际上是在重新分配引用,而不是修改原来的 String 对象。
代码示例:
String name = "kungfu";
name = "bruce lee";
分析:
-
String name = "kungfu";
在这一行,创建了一个新的String对象"kungfu",并让变量name引用(指向)它。此时,name保存的是对"kungfu"字符串对象的引用。 -
name = "bruce lee";
在这一行,没有修改"kungfu"字符串本身,而是让name变量重新指向一个新的字符串"bruce lee"。原来的"kungfu"对象依然存在,但变量name不再引用它了。
不可变性解释:
- 不可变性的意思是:一旦
String对象创建后,其内部的字符内容不能被改变。例如,如果你创建了"kungfu"这个字符串对象,这个对象中的字符k,u,n,g,f,u的值将永远不会改变。 - 但是,变量
name并不是字符串本身,而是一个引用。Java 允许你改变这个引用,使它指向一个新的String对象,例如"bruce lee",而不会改变原始字符串"kungfu"。
图示:
1.当执行 String name = "kungfu"; 时:
name → "kungfu"
2.当执行 name = "bruce lee"; 时:
name → "bruce lee" // 原来的 "kungfu" 字符串仍然存在,只是 name 不再指向它
实际上的不可变性:
如果你尝试修改一个 String 对象的内容,Java 不允许这样做。例如:
String name = "kungfu"; // 无法直接改变字符串内容,比如下面的操作是非法的 // name[0] = 'K'; // ❌ 编译错误
Java 的不可变性确保了 String 对象的安全性和高效性,尤其在多线程环境下,多个线程可以安全地共享同一个 String 对象而无需担心它会被修改。
可变替代方案:
如果你需要修改字符串的内容,Java 提供了像 StringBuilder 和 StringBuffer 这样的类,它们是可变的,可以对其内容进行修改:
StringBuilder sb = new StringBuilder("kungfu"); sb.append(" is awesome"); System.out.println(sb.toString()); // 输出: kungfu is awesome
总结:
- 不可变性:
String对象一旦创建,内容不能修改。 - 变量重新赋值:你可以让一个
String变量指向新的字符串对象,改变的是引用,而不是原始字符串内容。

浙公网安备 33010602011771号