关于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的不可变特性