Java中字符串的不可变性

Java中字符串的不可变性

考虑下面的例子。

String str = new String();str  = "Hello";System.out.println(str);  //Prints Hellostr = "Help!";System.out.println(str); 
 //Prints Help!

现在,在Java中,字符串对象是不可变的。那为什么这个物体str可以被分配值“帮助!”。这不是与Java中字符串的不可变性相矛盾吗?有人能解释一下不变性的确切概念吗?

编辑:

好的。我现在明白了,但只有一个后续问题。那么下面的代码呢?

String str = "Mississippi"; System.out.println(str); // prints Mississippi str = str.replace("i", "!"); System.out.println(str);
 // prints M!ss!ss!pp!

这是否意味着再次创建两个对象(“密西西比”和“M!SS!PP!”)以及参考str指向后面的另一个对象。replace()方法?


守候你守候我
浏览 524回答 4
4回答

MMTTMM

对象str引用可以更改,但实际String物体本身不能。这个String包含字符串的"Hello"和"Help!"无法改变它们的价值,因此它们是不可变的。不变性String对象并不意味着指向对象的引用不能更改。有一种方法可以防止str更改引用就是将其声明为final:final String STR = "Hello";现在,试图分配另一个String到STR将导致编译错误。

慕桂英546537

轻巧的手柄,我建议你读一读杯大小-一个关于变量的故事和请按值传递(杯号续)..这对阅读上面的帖子有很大帮助。你读过吗?是。好的。String str = new String();这将创建一个名为“远程控制”的新“远程控制”。str“并将其设置为new String()(或"").例如,在内存中,这会产生:str --- > ""str  = "Hello";这就改变了遥控器“str“但不修改原始字符串。"".例如,在内存中,这会产生:str -+   ""      +-> "Hello"str = "Help!";这就改变了遥控器“str“但不修改原始字符串。""或遥控器当前指向的对象。例如,在内存中,这会产生:str -+   ""      |   "Hello"      +-> "Help!"

江户川乱折腾

让我们把它分成几个部分String s1 = "hello";此语句创建包含以下内容的字符串你好并占据记忆中的空间常串池并将其分配给引用对象。沙一String s2 = s1;此语句分配相同的字符串。你好到新的参考S2&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;__________&nbsp; &nbsp; &nbsp; &nbsp; |&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; |s1 ---->|&nbsp; hello&nbsp; &nbsp;|<----- s2&nbsp; &nbsp; &nbsp; &nbsp; |__________|&nbsp;两个引用都指向相同的字符串,因此输出相同的值如下所示。out.println(s1);&nbsp; &nbsp; // o/p: helloout.println(s2);&nbsp; &nbsp; // o/p: hello尽管弦是不变,则可以将任务分配到沙一将引用新值。堆叠.s1 = "stack";&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;__________&nbsp; &nbsp; &nbsp; &nbsp; |&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; |s1 ---->|&nbsp; stack&nbsp; &nbsp;|&nbsp; &nbsp; &nbsp; &nbsp; |__________|但是关于S2对象,该对象指向你好它将是真实的。&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;__________&nbsp; &nbsp; &nbsp; &nbsp; |&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; |s2 ---->|&nbsp; hello&nbsp; &nbsp;|&nbsp; &nbsp; &nbsp; &nbsp; |__________|out.println(s1);&nbsp; &nbsp; // o/p: stackout.println(s2);&nbsp; &nbsp; // o/p: hello因为字符串是不可变的Java虚拟机不允许我们修改字符串S1用它的方法。它将创建池中的所有新字符串对象,如下所示。s1.concat(" overflow");&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;___________________&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; |&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;|s1.concat ----> |&nbsp; stack overflow&nbsp; &nbsp;|&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; |___________________|out.println(s1);&nbsp; &nbsp; // o/p: stackout.println(s2);&nbsp; &nbsp; // o/p: helloout.println(s1.concat); // o/p: stack overflow注如果字符串是可变的,则输出应该是out.println(s1);&nbsp; &nbsp; // o/p: stack overflow现在,您可能会感到奇怪,为什么String有这样的方法:凹()修改。下面的片段将清除您的困惑。s1 = s1.concat(" overflow");在这里,我们将字符串的修改后的值赋值给沙一推荐信。&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;___________________&nbsp; &nbsp; &nbsp; &nbsp; |&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;|s1 ---->|&nbsp; stack overflow&nbsp; &nbsp;|&nbsp; &nbsp; &nbsp; &nbsp; |___________________|out.println(s1);&nbsp; &nbsp; // o/p: stack overflowout.println(s2);&nbsp; &nbsp; // o/p: hello这就是为什么Java决定字符串将成为最后一个类否则,任何人都可以修改和更改字符串的值。希望这能帮点忙。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java