源码状态阅读源码可以发现,String是finalized了,它的value变量也finalized了。这是两件事;首先,String类是finalized的,不能继承该类。避免有人试图通过继承和重写来破坏String的内部数据;其次,内部成员变量charvalue[]被final修饰,value的引用地址不可变;原因分析安全1.安全使用,String是最常用的对象,Immutable避免了直接改变堆中对象的内容。除非我们主动修改引用地址,否则我们将String传入任何方法,它都不会改变,以防止在其他函数中不小心被改变;2、线程安全,String并发使用时,无需考虑其线程安全问题;性能1、String缓冲池,采用享元模式,减少了String对象的生成,享元模式的缺点是对象内部状态不能改变;2、Hash算法,因为String初始化是不可变的,所以一个String的hashcode是固定不变的,只能计算一次,String最适合作为hashMap中的Key;个人思考为什么要final修改String类,先从字符串享元说起。假设String的定义产生了新的对象,那么在初始化多个“ABC”时,内存中就会有多个“ABC”字符串对象占用空间;这时候,考虑节省空间。你应该先创建一个内存空间来存放这个“ABC”,然后让所有需要使用这个字符串的对象直接指向这个地址;这时需要防止内存中“ABC”的值被其他人改变(即String的值),所以value变量被final修饰(如果不是final则内存空间中的值指针所指向的将被改变);如上,即使value被final修饰了,也有可能被子类通过重写方法Value来修饰,所以String类也是final修饰的,这样是不可变的,即一旦定义了String,它不会改变;publicfinalclassStringimplementsjava.io.Serializable,Comparable
