由源码可以看出String的本质是一个char数组,是对字符串数组的封装,并且是被final修饰的,创建后不可改变。
不可变的好处
java开发者认为不可变的字符串带来的共享的便利、节省去新构建对象(尤其是大量的字符串)的空间消耗和性能消耗远远大于对字符串修改所带来的便利性。
1.便于实现字符串池(String pool)
在Java中,由于会大量的使用String常量,如果每一次声明一个String都创建一个String对象,那将会造成极大的空间资源的浪费。Java提出了String pool的概念,在堆中开辟一块存储空间String pool,当初始化一个String变量时,如果该字符串已经存在了,就不会去创建一个新的字符串变量,而是会返回已经存在了的字符串的引用。
2.使多线程安全
并发场景下,多个线程同时读一个资源,是安全的,不会引发竞争,但对资源进行写操作时是不安全的,不可变对象不能被写,所以保证了多线程的安全。
3.加快字符串处理速度
由于String是不可变的,保证了hashcode的唯一性,于是在创建对象时其hashcode就可以放心的缓存了,不需要重新计算。这也就是Map喜欢将String作为Key的原因,处理速度要快过其它的键对象。所以HashMap中的键往往都使用String。
如何实现不可变
1.类本身是final修饰的
2.数组也是final修饰的 private 修饰的
3.整个类没有提供任何一个修改数组内容,以及返回数组引用的方法