String为什么是final的
原因
总的来说是为了:"效率",“线程安全”,和“共享”。
因为final不允许被继承,而String是被高度使用的,如果String允许被继承,会降低程序的性能。
- 为了不可变性
private final String 两者共同作用保证字符串的不可变性;
- 实现字符串池
多个字符串的值相同的话,他们指向的是同一个内存地址,可以节省空间,提高效率。
- 线程安全
正是字符串不可变,在并发多线程读同一个资源时,不可变对象不能被写,保证了多线程安全,同一个字符串实例可以被多个线程共享;
- 如果字符串可变,黑客可能通过改变字符串指向对象的值造成安全漏洞
源码
JDK源码
public final class String implements java.io.Serializable, Comparable<String>, CharSequence { /** The value is used for character storage. */
//这个value是用来装char的.明白了吧,String其实是char数组的包装类。
//而这个数组是final类型的,不可能指向别的对象,但是可以改 private final char value[]; /** Cache the hash code for the string */缓存hashCode private int hash; // Default to 0 }