字符串不可变?

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)

sin*_*ash 8

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.


在此输入图像描述



The*_*ind 6

将您的代码更改为:

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表示您无法修改该对象.

注意:反射可用于打破字符串的不变性.