Java中的String真的是不可变的吗?

首先,Java中的String对象一旦被创建就具备不可修改的特性,对String对象的任何操作都不能改变原来String的值,任何改变的操作都会产生一个新的对象。为了验证这个特性,我们来看一个小实验:Java中的String真的是不可变的吗?_第1张图片

通过这个实验我们会发现一个问题,就是对字符串String的任何操作(改变大小写、替换等)都不会影响字符串对象hello本来的值,但是这些更改的操作会产生一个新的对象,新的对象确实拥有了修改后的新值。

String类还有一个非常重要的特征,就是String类是final修饰的,也就是我们通常所说的“最终类”,这说明String类放弃了拥有子类的权利,看一下Java官方文档(jdk9)对String类的描述:Java中的String真的是不可变的吗?_第2张图片

通过这个描述可以清晰的看到String类的定义是final的。

其实,Java中的String类虽然看似简单明了,但是关于String的内容远比看起来的要复杂的多,因为String涉及到了JVM中三个关键的概念,分别是“常量池”、“栈”和“堆”。由于String类的频繁使用会占用大量的时间(空间),所以JVM为String类创建了一个存放字符串的“常量池”,池中存放了大量的字符串常量。为了理解这个字符串常量池,我们可以看一个简单的实验:Java中的String真的是不可变的吗?_第3张图片

通过这个实验我们可以看出,两个对象StringA和StringB是指向同一个字符串常量,所以他们对比的返回值是true。接着看下面这个例子:Java中的String真的是不可变的吗?_第4张图片

这个例子却返回了截然不同的结果,原因在于new每次会创建一个新的对象,所以对比的结果是false(关于这个解释其实可以描述的非常复杂,这里就略了)。

关于String的内容虽然看似简单,实则比较复杂,我们能通过String类来解释很多JVM的运行机制,所以String类是一个值得深究的类。

我使用Java语言多年,我也出版过关于Java编程的书籍,我会陆续在头条上写一些关于Java方面的文章,感兴趣的朋友可以关注我的头条号,相信一定会有所收获。

如果有Java方面的问题,也可以咨询我。

谢谢!

你可能感兴趣的:(Java中的String真的是不可变的吗?)