java中的可变和不可变String之间有什么区别

Rag*_*ghu 48 java string mutable stringbuffer immutability

据我所知,

可以更改可变字符串,并且不能更改不可变字符串.

在这里,我想像这样更改String的值,

String str="Good";
str=str+" Morning";
Run Code Online (Sandbox Code Playgroud)

和其他方式是,

StringBuffer str= new StringBuffer("Good");
str.append(" Morning");
Run Code Online (Sandbox Code Playgroud)

在这两种情况下,我试图改变其价值str.任何人都可以告诉我,这两种情况有什么不同,并给我清晰的可变和不可变对象的图片.

The*_*ind 89

情况1:

String str = "Good";
str = str + " Morning";
Run Code Online (Sandbox Code Playgroud)

在上面的代码中,您将创建3个String对象.

  1. "好"它进入字符串池.
  2. "早上"它也会进入字符串池.
  3. 通过连接"好"和"早晨"创造的"早安".这家伙继续.

注意:字符串总是不可变的.没有,像一个可变的字符串.str只是一个参考,最终指向"早安".实际上,你不是在研究1对象.你有3不同的String对象.


案例2:

StringBuffer str = new StringBuffer("Good"); 
str.append(" Morning");
Run Code Online (Sandbox Code Playgroud)

StringBuffer包含一个字符数组.这是一样的String.上面的代码将字符添加到现有数组中.实际上,它StringBuffer是可变的,它的String表示不是.

  • 你能告诉我为什么"GoodMorning"会转到堆而不是字符串池.? (2认同)
  • @DilanG - 在内部(如果字符串文字没有标记为`final`),使用StringBuilder/StringBuffer进行字符串连接 (2认同)

Phi*_*der 13

java中的可变和不可变String之间有什么区别

不可变的存在,可变的不存在.

  • `StringBuffer`扮演可变字符串的角色.注意`String`和*string*之间的区别. (3认同)
  • @TheLostMind更仔细地阅读我的评论:*string*与`String`不同.一个是常见概念,另一个是Java类.`StringBuffer`绝对是Java中可变字符串的用途. (3认同)

Bal*_*duz 8

在Java中,所有字符串都是不可变的.当您尝试修改a时String,您真正在做的是创建一个新的.但是,当您使用a时StringBuilder,实际上是在修改内容,而不是创建新内容.


Men*_*ena 5

Java String是不可变的.

在你的第一个例子,你改变了参考String,从而赋予它的其他两个值Strings组合:str + " Morning".

相反,a StringBuilderStringBuffer可以通过其方法进行修改.