繁体   English   中英

字符串不变性

[英]Strings Immutability

有人告诉我不能更改Java中的字符串。下面的代码呢?

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

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

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

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

这是Stringjavadoc ,您可以在其中找到所有方法的作用。

这是将引用变量(名称)与它所引用的String对象(“名称”)混淆的经典案例。 它们是两种截然不同的野兽。 字符串从不改变(忽略反射类型的乱码),但是引用变量可以根据需要引用尽可能多的不同字符串。 您会注意到,如果您刚刚打电话

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

什么都没发生。 仅当您将名称变量分配给另一个String(由replace方法返回)时,您才能看到更改。

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

输出: name

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

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

尝试一下,自己看看吧:

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

如果将新的引用分配给r,则原始对象不会更改。

我希望这有帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM