Sit*_*nsu -1 java string heap stack immutability
有人能回答我吗?
public class ReplaceString{
public static void main(String arg[]) {
String a = "Hariom";
a = a.replace('H', 'b');
System.out.println(a);
}
}
Run Code Online (Sandbox Code Playgroud)
A String
是不可变的,这意味着您无法更改同一地址上的字符串值.如果更改它,它将创建一个新对象,您必须将其分配给当前字符串对象.例如,
String a = "Hariom";
a.replace('H', 'b');
System.out.println(a); //will print "Hariom"
Run Code Online (Sandbox Code Playgroud)
因为a
没有改变.相反,您String
使用值在内存中创建了一个新的bariom
并显示更改为a
,您必须将新创建的字符串指向a
,即
a= a.replace('H', 'b');
Run Code Online (Sandbox Code Playgroud)
也许这会更清楚一些:
第1步:String a = "Hariom";
在内存中创建一个新字符串,变量a
指向它.
第2步:a.replace('H', 'b');
如果替换了某个字符String
a
,String
则在堆中创建一个new ,没有指向它的变量.
第3步: a= a.replace('H', 'b');
如果调用replace()
并将其分配给变量a
,那么会String
bariom
在堆中创建new .然后将其分配给a
导致a
指向新的String
.
将您的代码更改为:
public static void main(String arg[]) {
String a = "Hariom";
String b = a.replace('H', 'b'); // returns a new string instance
System.out.println(a==b); // prints false
}
Run Code Online (Sandbox Code Playgroud)
b
并且a
是不同的对象.immutable
表示您无法修改该对象.
注意:反射可用于打破字符串的不变性.