[英]Strings Immutability
有人告诉我不能更改Java中的字符串。下面的代码呢?
name="name";
name=name.replace('a', 'i');
它不更改name
字符串吗? 另外,replace()的实现在哪里; 相比于(); 等于(); 提供? 我只是在这里使用这些功能,但实际上在哪里实现?
这是将引用变量(名称)与它所引用的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.