1、什么是final

final意思是,最终,如果一个类不想被子类继承,或者不想被子类的方法重写,可以用final修饰此类,final类中的方法默认也会是final类型的。final关键字可以修饰类类的成员变量、类的成员方法、局部变量

(1)被final关键字修饰后的变量(成员变量、局部变量)只能赋值一次,final修饰后的变量只能在这个类的内部使用,不能在类的外部直接使用

(2)引用类型的变量值为对象地址值,赋值之后,地址不能再更改,但是地址内的对象属性值可以修改

(3)final 标记的成员变量必须在声明的同时或在该类的构造方法中显式赋值

 

2、String类特点

(1)String类的源码:



public final class String
implements java.io.Serializable, Comparable<String>, CharSequence {
/** The value is used for character storage. */
private final char value[];

/** Cache the hash code for the string */
private int hash; // Default to 0

/** use serialVersionUID from JDK 1.0.2 for interoperability */
private static final long serialVersionUID = -6849794470754667710L;


 


(2)创建一个类继承String类:

Javase(String类为什么是final)_成员变量

 继承String类的时候报错,这是因为String类已经被声明为final是不能被子类继承的。

 

3、String类为什么被声明为final的?

(1)安全性:

String类不能被继承,就没有办法修改该类,所以保证了该类的安全性。

(2)效率问题:

如果在每次使用String类的时候为了保证安全性都用final修饰,会比较麻烦降低效率,直接在类内部声明,提高了效率。

(3)为了实现字符串常量池:

创建字符串时,如果该字符串已经存在于池中,则将返回现有字符串的引用,而不是创建新对象(节省内存)。​​多个String变量引用指向同一个内地地址,​​如果字符串是可变的,用一个引用更改字符串将导致其他引用的值错误,这样的话字符串常量池将不能实现。

(4)为了线程安全:

因为字符串是不可变的,所以是多线程安全的,同一个字符串实例可以被多个线程共享。

(5)为了实现String可以创建HashCode的不可变性:

因为字符串是不可变的,所以在它创建的时候HashCode就被缓存了,不需要重新计算。字符串的处理速度要快过其它键的对象,这也是Map的key用String最多的原因。

 


每个人都会有一段异常艰难的时光 。 生活的压力 , 工作的失意 , 学业的压力。 爱的惶惶不可终日。 挺过来的 ,人生就会豁然开朗。 挺不过来的 ,时间也会教你 ,怎么与它们握手言和 ,所以不必害怕的。 ——杨绛