为什么String是不可变的
为什么String是不可变的
字符串常量池
因为jvm设计了字符串常量池,将字符串缓存到字符串常量池。如果字符串是可变的,这样的缓存就变得效率低下了。
线程安全问题
如果字符串是可变的,假设有很多变量指向同一个字符串,如果这个字符串发生变化,从abc变为123,那么所有的变量指向的值发生变化,如果有线程需要读取字符串,前后读取的值不一样,这就需要对字符串采取额外措施保证是线程安全的,会导致编码工作量编码,而且字符串是特别常用的,如果每个字符串都需要考虑线程安全问题,工作量会变得很大。如果是不可变的,线程安全的问题就不会发生了。
缓存问题
string对象缓存了自身的hashcode,如果字符串可变,那么缓存的hashcode就失效了,需要重新计算hashcode,也会导致效率低,特别是在hashmap的操作中,用到了很多hashcode比较。
类加载器
类加载器使用String保存全类名。如果String可以改变,那么就可能会将HashMap的加载换成自定义类的加载,这样就有安全问题。

浙公网安备 33010602011771号