关于Java中的String类的不可变

Posted 我叫普朗台

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于Java中的String类的不可变相关的知识,希望对你有一定的参考价值。

此处,不再论述String的不可变,只说说为什么String是不可变的。

粗暴点,直接来了,String的不可变原因有三:

1).String类是final的

用final修饰的类是不可被继承的,用在了String类就代表它不可被继承,不可被后来的程序员用新类继承然后修改它。 这一招,意在让String “断子绝孙”,我认为和阉割有异曲同工之妙。

2).String的值是一个char数组,是被final和private修饰的

贴一下String的源代码:

1 public final class String
2     implements java.io.Serializable, Comparable<String>, CharSequence {
3     /** The value is used for character storage. */
4     private final char value[];
5 .........
6 }

可以看到,String的值实际上是存在一个私有的final char数组中的,数组是一个引用型变量,给它加一个final作用是使value这个句柄的引用地址不可变,但是value指向的数组是放在heap堆中的,它的值是可以改变的

private修饰的作用是使value不能被其他类访问到,这一点就防止了其他的类直接操作value引用指向的heap堆中的数据。

3).String设计人员在后面的所有方法中都避免了直接操作heap中的数据

在第二点中提到了,“value指向的数组是放在heap堆中的,它的值是可以改变的”。虽然value被final修饰,但是作用并不大,甚至final对value的保护作用还不如private。之所以在我们的使用中无法对字符串做修改,是因为Sun公司的程序员在设计String的时候,都小心地避过了直接操作字符串的内容。

以上是关于关于Java中的String类的不可变的主要内容,如果未能解决你的问题,请参考以下文章

从字节码和JVM的角度解析Java核心类String的不可变特性

java中的不可变类型的探究

String 和 Stringbuild

JAVA不可变类(immutable)机制与String的不可变性

关于String的对象创建

java中的不可变类