字符串不可变?

String immutable?

有人能回答我吗?

public class ReplaceString{

    public static void main(String arg[]) {
        String a = "Hariom";
        a = a.replace('H', 'b');
        System.out.println(a);
    }
}
a = a.replace('H', 'b');

这不会修改 String a,它 returns 一个新的 String 实例(除非没有任何东西可以替换,在这种情况下原始 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
    }

ba 不同的 对象。 immutable 表示您不能 修改 该对象。

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

根据 Javadocs:

String#replace(char oldChar, char newChar) method Returns a new string resulting from replacing all occurrences of oldChar in this string with newChar

String a = "Hariom";
a = a.replace('H', 'b');
/* method returns new instance of String ("bariom")
   and you referencing the new instance to variable a, 
   so now String object "Hariom" is no longer referenced by any variable
   and is available for garbage collection.
*/
System.out.println(a);

A String 是不可变的,这意味着您不能更改同一地址上的字符串值。如果你改变它,它会创建一个新对象,你必须将它分配给当前的字符串对象。例如,

 String a = "Hariom";
 a.replace('H', 'b');
 System.out.println(a);   //will print "Hariom"

因为a没有改变。相反,您在内存中创建了一个值为 bariom 的新 String 并显示对 a 的更改,您必须将新创建的字符串指向 a,即

a= a.replace('H', 'b');

也许这样会更清楚一点:

第 1 步: String a = "Hariom"; 你在内存中创建一个新字符串,变量 a 指向它。



步骤 2a.replace('H', 'b'); 如果您替换 String a 中的某些字符,则会在 String 中创建一个新的 String没有变量指向它的堆。



步骤 3a= a.replace('H', 'b'); 如果您调用 replace() 并将其分配给变量 a,会发生什么情况是新的 String bariom 在堆中创建。然后你将它分配给 a 导致 a 指向新的 String.



a.replace('H', 'b');

生成一个新字符串。然后将 a 变量设置为新值。

a.replace 不修改 a,它 returns 一个 new String 对象。如果你调用 a.replace 而没有重新分配给 a,你会注意到原来的 String 没有改变。

变量可以包含不可变对象,但您仍然可以重新分配给它们。重新分配不会改变对象,它只会改变变量引用的对象。