要知道为什么字符串使用final关键字,首先要知道final关键字是什么。
final的意思为最终,不可变。final是个修饰 符,它可以修饰类,类的成员,以及局部变量。
- final修饰类不可以被继承,但是可以继承其他类
- final修饰的方法不可以被覆盖,但父类中没有被final修饰方法,子类覆盖后可以加final
- final修饰的变量称为常量,这些变量只能赋值一次,定义的时候必须有初始值
- final修饰的引用类型变量,表示该引用变量的引用不能变,而不是引用所指的对象中的数据还是 可以变化的
String类:
String类用final修饰,代表String类不可被继承。
在String源码里,除了String类被final修饰外,value数组也被final修饰,String类本质上就是一个不可变的char数组。
1、因为String类的不可变性,才能使得JVM可以实现字符串常量池;字符串常量池可以在程序运行时节约很多内存空间,因为不同的字符串变量指向相同的字面量时,都是指向字符串常量池中的同一个对象。这样一方面能够节约内存,另一方面也提升了性能。
2、因为String类的不可变性,从而保证了字符串对象在多线程环境下是线程安全的。如果String类是可变的,那么会引起很严重的安全问题。
我们在很多情况下都是直接通过字符串传递数据,比如用户名、密码等,如果字符串是可变的,那么可以通过改变引用地址指向的值去修改字符串的值,从而导致安全漏洞,引发严重的后果。