Java中String类为什么是final类型?
String是我们平时开发中最常用的类之一,它的底层是char[ ]数组(JDK 1.9 之后是Byte[ ]数组),可是你知道它为什么是final类型的吗?
private final char value[];
1、安全
在多线程的场景下,多个线程对String进行读操作时,不会发生线程安全问题,而String是final类型的,具有不可变性,所以不能对String进行写操作,此时线程也是安全的。
String s = new String (“abc”);
不仅仅是线程安全,它还保证了底层Array数组的安全。当创建字符串对象时,s指向了 “abc” 的地址,“abc” 的底层是value数组, value数组的引用地址是不会变的,但是Array数组是可变的,Array存储的数据结构见下图:
举个数组被修改的例子:
final int value[ ] = {1,2,3};
value[0]=0; //此时value的值为{0,2,3}
所以这里数组value是private和final类型,防止被子类继承直接对数组进行修改,引起安全问题。
2、实现字符串常量池
当String是final类型时,才能实现字符串常量池。如果String不是final类型,当两个引用同时指向一个字符串对象时,其中一个引用修改字符串值时,另一个引用也会被修改。下面代码中,one和two都指向了同一个地址。
String one = " something ";
String two = " something ";
在大量使用字符串的情况下,字符串常量池可以节省内存空间,提高效率。如果发生上面的情况,字符串常量池就没有存在的意义了。
ps:目前博主只想到这两点,如果大家有更好的答案,欢迎大家在留言区补充。