字符串不可变?

时间:2015-04-24 07:25:48

标签: java string stack heap immutability

有人可以回答我吗?

public class ReplaceString{

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

6 个答案:

答案 0 :(得分:8)

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

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

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

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

也许这会更清楚一点:

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

enter image description here

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

enter image description here

第3步a= a.replace('H', 'b');如果您致电replace()并将其分配给变量a,那么会发生新的String {在堆中创建{1}}。然后,您将其分配给bariom,导致a指向新的a

enter image description here

答案 1 :(得分: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
    }

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

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

答案 2 :(得分:4)

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

这不会修改String a,它会返回一个新的String实例(除非没有要替换的内容,在这种情况下原始String退回)。

答案 3 :(得分:2)

根据Javadocs:

  

String#replace(char oldChar, char newChar)方法返回一个新字符串,该字符串是用newChar替换此字符串中所有出现的oldChar而得到的

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);

答案 4 :(得分:0)

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

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

答案 5 :(得分:0)

a.replace不会修改a,它会返回 new String对象。如果您在未重新分配到a.replace的情况下致电a,您会发现原始字符串未发生变化。

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