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 ";

在大量使用字符串的情况下,字符串常量池可以节省内存空间,提高效率。如果发生上面的情况,字符串常量池就没有存在的意义了。

经验分享 程序员 微信小程序 职场和发展