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对比:

这里写图片描述

转载于:https://my.oschina.net/u/3239611/blog/1634774

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值