Java如何使所有String对象都是不可变的?

时间:2019-12-25 16:59:17

标签: java string object

如果这是一个显而易见的问题,对不起,因为我是Java的初学者。

字符串对象是不可变的,这意味着它们不能更改。 因此,如果您实例化:

String s = "hello";

然后更改s的内容,

s = "goodbye";

这是否意味着创建了一个新的String对象,也称为s?原始变量s的值是否被更改?还是其参考文献被更改?预先谢谢您,因为字符串不变性的概念使我感到困惑。

2 个答案:

答案 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
相关问题