如果这是一个显而易见的问题,对不起,因为我是Java的初学者。
字符串对象是不可变的,这意味着它们不能更改。 因此,如果您实例化:
String s = "hello";
然后更改s的内容,
s = "goodbye";
这是否意味着创建了一个新的String对象,也称为s?原始变量s的值是否被更改?还是其参考文献被更改?预先谢谢您,因为字符串不变性的概念使我感到困惑。
答案 0 :(得分:1)
创建
时String s = "hello";
在字符串池中查找之后,java在字符串池中创建一个新字符串,并将该字符串的引用返回给s。
现在将s的内容更改为
s = "goodbye";
再次,如果再见不在字符串池中,它将在字符串池中创建一个新字符串,并返回新创建的字符串的引用。
因此,您的问题的答案是字符串是不可变的。
如果要执行许多操作,并且字符串内容将经常更改,则可以使用字符串生成器或字符串缓冲区,这些类是可变的。
答案 1 :(得分:0)
您将不变性与final
修饰符可以实现的功能互换。
如果将变量声明为final,则意味着引用不能指向除初始化之外的其他实例:
final String string = "A";
string = "B"; // won't compile
String anotherString = "A"
anotherString = "B"; // this is okey
不变性的观点是实例的 inner 字段不变。 String
的方法从原始的String
返回一个新的String string = "A";
string.toLowerCase(); // will be still "A"
String anotherString = "A";
String newString = anotherString.toLowerCase();
// anotherString is "A"
// newString is "a"
,同时保持不变:
final
请注意,不可变对象的使用不需要bar
修饰符,但是它用于在被设计为不可变的对象中自身实现不可变性。此类是不可变的,因为public class Foo {
private final int bar;
public Foo(int bar) {
this.bar = bar;
}
}
被实例化了一次,并且从未更改过:
unordered_map