字符串不变性

时间:2011-09-21 04:34:23

标签: java string immutability

我被告知java中的字符串无法更改。以下代码是什么?

name="name";
name=name.replace('a', 'i');

它不会改变name字符串吗? 另外,replace()的实现在哪里;相比于();等于();提供? 我只是在这里使用这些功能,但它们实际上在哪里实现?

4 个答案:

答案 0 :(得分:6)

String.replace()返回一个新的String。

“name”是对String对象的引用,因此可以将其重新分配为指向name.replace(),但它将指向一个新对象。

以下是javadoc for String,您可以在其中找到所有方法的功能。

答案 1 :(得分:1)

这是将引用变量(name)与其引用的String对象(“name”)混淆的典型案例。他们是两个非常不同的野兽。字符串永远不会更改(忽略反射类型kludges),但引用变量可以根据需要引用许多不同的字符串。你会注意到,如果你刚刚打电话

name.replace('a', 'i');
没有任何反应。如果将名称变量分配给另一个字符串,即replace方法返回的字符串,则只能看到更改。

答案 2 :(得分:0)

试试这个并亲自看看:

String name = "name";
String r    = name.replace( 'a', 'i' );
System.out.println( name );// not changed 
System.out.println( r    ); // new, different string 

如果将新ref指定给r,则原始对象不会更改。

我希望这会有所帮助。

答案 3 :(得分:0)

如果您的代码是 name="name"; name.replace('a', 'i'); //assignment to String variable name is neglected System.out.print(name)

输出: name

这是因为name.replace('a','i')会将替换后的字符串nime放入字符串池中,但引用不会指向字符串变量名。

每当你尝试修改一个字符串对象, java检查时,结果字符串是否在字符串池 中可用(如果可用)可用字符串的引用指向字符串变量{ {1}}否则在字符串池中创建新的字符串对象,并将创建的对象的引用指向字符串变量。