String为什么要设计成final

前言:

今天突然看到一个问题为什么String类型设计为final,之前没深入想过这个问题,现在来看看。

源码中对String为什么设计成final的解释:

Strings are constant; their values cannot be changed after they are created. String buffers support mutable strings. Because String objects are immutable they can be shared. 
字符串是恒定的,创建之后它们的值不能被改变。StringBuffer是可变的strings.字符串对象不可变让它们可以被共享。

什么叫不可改变?

就是这个值一旦在常量池被创建,是无法修改的,即便你在后面拼接一些其他字符,也会把新生成的字符串存到另外一个地址了,比如:

    String a = "abc";
    Log.e("ss","a之前的hashCode:"+a.hashCode());//a之前的hashCode:96354
    a = "abc" + "123";
    Log.e("ss","a之后的hashCode:"+a.hashCode());//a之后的hashCode:-1424436592

为什么不可变?

之前一直不能理解为什么String创建之后不能被修改,因为陷入了2个低级误区,想明白了这些问题一切都很好理解了:

1.错把不可修改当成了字符串变量的指向,因为即便改变了字符串变量的指向,但是原来的字符串还是在常量池一切都没变;

2.把字符串的存储位置在常量池忽略了,常量池中的数据可以被共享,导致可能很多地方都在操作这个对象,尤其在多线程中是很危险的。

不可变有什么好处?

1.线程安全

2.支持字符串常量池数据共享,节省资源,提高效率(因为如果已经存在这个常量便不会再创建,直接拿来用)

String,StringBuffer和StringBuilder对比:

这里写图片描述

猜你喜欢

转载自my.oschina.net/u/3239611/blog/1634774