Java面试基础篇——第二篇:String类能为何不能被继承?

public final class String implements java.io.Serializable, Comparable<String>, CharSequence {

}

String类有final修饰符,而final修饰的类是不容许被继承的,实现的细节也没法改变。java

String类为什么被设计为不能继承?

1.带有 final 修饰符的类是不可派生的。 如 java.lang.String, 为 String 类指定 final 防止了人们覆盖 length() 方法。sql

2.若是指定一个类为 final,则该类全部的方法都是 final。 java 编译器会寻找机会内联(inline)全部的 final 方法。数据库

3.由于字符串是不可变的,因此是多线程安全的,同一个字符串实例能够被多个线程共享缓存

4.类加载器要用到字符串,不可变性提供了安全性,以便正确的类被加载。譬如你想加载java.sql.Connection类,而这个值被改为了myhacked.Connection,那么会对你的数据库形成不可知的破坏。安全

5.由于字符串是不可变的,因此在它建立的时候hashcode就被缓存了,不须要从新计算。这就使得字符串很适合做为Map中的键,字符串的处理速度要快过其它的键对象。这就是HashMap中的键每每都使用字符串。多线程

6.当字符串是不可变时,字符串池才有可能实现。字符串池的实现能够在运行时节约不少heap空间,由于不一样的字符串变量都指向池中的同一个字符串。但若是字符串是可变的,那么String interning将不能实现(String interning是指对不一样的字符串仅仅只保存一个,即不会保存多个相同的字符串。),由于这样的话,若是变量改变了它的值,那么其它指向这个值的变量的值也会一块儿改变。线程

相关文章
相关标签/搜索