2011-09-21 33 views
2

有人告诉我,在java中的字符串不能改变。下面的代码是什么?字符串不变性

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

没有它改变name字符串? 另外,replace()的实现在哪里?相比于();等于();提供? 我只是在这里使用这些函数,但实际上他们在哪里实现?

+1

请注意,1)变量*不是对象*和; 2)'String.replace'方法返回*新的String对象* - 原始对象不变。 – 2011-09-21 04:41:31

回答

6

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

“name”是对String对象的引用,所以它可以被重新指定为指向name.replace(),但它将指向一个新的对象。

这里是javadoc for String,在这里你可以找到所有的方法。

+0

该名称引用的原始对象会发生什么情况? – Kraken

+0

如果“name”是该对象的唯一引用,那么该对象将消失并且将被垃圾收集。如果别的东西持有对该对象的引用,那么它将继续存在。 –

+0

不,它不会立即GC'd,但可能存储在字符串池中一段时间​​,以备再次使用。 –

1

这是一个将引用变量(名称)与引用的String对象(“name”)混淆的经典案例。他们是两个截然不同的野兽。字符串不会改变(忽略反射类型的kludges),但引用变量可以根据需要引用许多不同的字符串。你会注意到,如果你只是叫

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

什么也没有发生。如果将名称变量分配给不同的字符串,则只能看到更改,该字符串是由replace方法返回的字符串。

0

试试这个,看看它为你的自我:

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

如果您分配了新的裁判R,原来的对象不会改变。

我希望这会有所帮助。

+0

这实际上并不表现出不变性。 –

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的检查,是结果字符串在字符串池中 可如果有可用的字符串的引用指向可变 其他新的字符串对象被创建的字符串字符串池和创建的对象的引用被指向字符串变量。