什么是final,参看我的上一篇文章:Java关键字之final
Java中我们最常用的类String被final修饰,final修饰类,代表了而这个类不允许被继承,这个类就是一个终结。
为什么String类要被定义为final的呢?
因为String类要保证他的实例不可变,不可变和被final修饰其实是两件事。
String为了保证他的实例不可变做了三件事:
- 内部成员变量char[]被final修饰,char[] 引用地址不可变。
- 所有对外提供的方法,都不会去尝试修改char[]内部的元素。这就是封装的好处。
- String类被final修饰,类不可以被继承。规避了有坏人想尝试通过继承重写来破坏String内部的数据。
所以String类被定义为final最终的目的是为了保证String类实例不可变。
为什么String类实例要设定为不可变?
- 字符串缓冲池,使用享元模式,减少String对象的产生,而享元模式的弊端就是对象的内部状态不可变。
- 使用安全,String是我们程序中最最常用的对象,不可变规避了直接在堆中直接改变对象内容,除非我们主动修改引用地址,否则我们将String传递进任何方法中,他都不会改变。防止一不小心就在其他函数内被更改了。
- 线程安全,并发使用String时,不需要再去考虑他的线程安全问题。
- 性能,由于String一出生或一初始化就不可变,所以一个String的hashcode是固定的不变的,可以只计算一次,并且String是最适合作为hash表结构中Key的类。
- 设定为不可变之后,String就更贴近一个基本类型了,这可能也是JDK开发者的期望。
网友评论