为了账号安全,请及时绑定邮箱和手机立即绑定

Java中字符串的不可变性

Java中字符串的不可变性

守候你守候我 2019-06-03 16:33:38
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()方法?
查看完整描述

4 回答

?
MMTTMM

TA贡献1869条经验 获得超4个赞

对象str引用可以更改,但实际String物体本身不能。

这个String包含字符串的"Hello""Help!"无法改变它们的价值,因此它们是不可变的。

不变性String对象并不意味着指向对象的引用不能更改。

有一种方法可以防止str更改引用就是将其声明为final:

final String STR = "Hello";

现在,试图分配另一个StringSTR将导致编译错误。


查看完整回答
反对 回复 2019-06-03
?
慕桂英546537

TA贡献1848条经验 获得超10个赞

轻巧的手柄,我建议你读一读杯大小-一个关于变量的故事请按值传递(杯号续)..这对阅读上面的帖子有很大帮助。

你读过吗?是。好的。

String str = new String();

这将创建一个名为“远程控制”的新“远程控制”。str“并将其设置为new String()(或"").

例如,在内存中,这会产生:

str --- > ""

str  = "Hello";

这就改变了遥控器“str“但不修改原始字符串。"".

例如,在内存中,这会产生:

str -+   ""
     +-> "Hello"

str = "Help!";

这就改变了遥控器“str“但不修改原始字符串。""或遥控器当前指向的对象。

例如,在内存中,这会产生:

str -+   ""
     |   "Hello"
     +-> "Help!"


查看完整回答
反对 回复 2019-06-03
?
江户川乱折腾

TA贡献1851条经验 获得超5个赞


让我们把它分成几个部分


String s1 = "hello";

此语句创建包含以下内容的字符串你好并占据记忆中的空间常串池并将其分配给引用对象。沙一


String s2 = s1;

此语句分配相同的字符串。你好到新的参考S2


         __________

        |          |

s1 ---->|  hello   |<----- s2

        |__________| 

两个引用都指向相同的字符串,因此输出相同的值如下所示。


out.println(s1);    // o/p: hello

out.println(s2);    // o/p: hello

尽管弦是不变,则可以将任务分配到沙一将引用新值。堆叠.


s1 = "stack";    

         __________

        |          |

s1 ---->|  stack   |

        |__________|

但是关于S2对象,该对象指向你好它将是真实的。


         __________

        |          |

s2 ---->|  hello   |

        |__________|


out.println(s1);    // o/p: stack

out.println(s2);    // o/p: hello

因为字符串是不可变的Java虚拟机不允许我们修改字符串S1用它的方法。它将创建池中的所有新字符串对象,如下所示。


s1.concat(" overflow");


                 ___________________

                |                   |

s1.concat ----> |  stack overflow   |

                |___________________|


out.println(s1);    // o/p: stack

out.println(s2);    // o/p: hello

out.println(s1.concat); // o/p: stack overflow

注如果字符串是可变的,则输出应该是


out.println(s1);    // o/p: stack overflow

现在,您可能会感到奇怪,为什么String有这样的方法:凹()修改。下面的片段将清除您的困惑。


s1 = s1.concat(" overflow");

在这里,我们将字符串的修改后的值赋值给沙一推荐信。


         ___________________

        |                   |

s1 ---->|  stack overflow   |

        |___________________|



out.println(s1);    // o/p: stack overflow

out.println(s2);    // o/p: hello

这就是为什么Java决定字符串将成为最后一个类否则,任何人都可以修改和更改字符串的值。希望这能帮点忙。


查看完整回答
反对 回复 2019-06-03
  • 4 回答
  • 0 关注
  • 523 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号