字符串不可变

java字符串不可变

字符串常量池

什么是字符串常量池呢?
字符串常量池就是一个存储着各种字符串的一个常量,简单理解就是一些字符串对象的缓存池。里面缓存着各种字符串。
比如下面的代码

String	s1 = "abc";
String s2 = "abc";

在这段代码中初始化s1时会先去常量池中查询有没有"abc"这个字符串。如果没有创建一个"abc"存储在常量池中。这时当初始化s2时发现常量池中已经存在了"abc"就会直接引用这个字符串,不需要重新创建字符串对象了。
备注:如果通过new的方式创建字符串对象是会直接创建对象的。

为什么字符串不可变

1.字符串池的要求:

首先从字符串常量池的设计角度 就要求着字符串不可变。如果字符串是可变的,用一个引用更改字符串将导致其他引用的值错误

2.缓存Hashcode

在Java中,字符串的Hashcode经常被用到。例如,在一个HashMap或HashSet。一成不变的保证hashcode永远是相同的所以它可以兑现,不用担心变化。这意味着,不需要计算hashCode每次使用它。这更有效。

3.安全

字符串被广泛用于许多java类的参数,如网络连接、打开文件、字符串等都不是一成不变的,一个连接或文件将被改变,这可能导致严重的安全威胁。方法认为它是连接到一台机器,但不是。可变字符串也可能导致反射中的安全问题,因为参数是字符串

4.不可变对象自然是线程安全的

因为不可变对象不能更改,所以可以在多个线程之间自由共享。这消除了进行同步的要求

不可变的缺点

不可变意味着修改性能差,这也是为什么在频繁修改字符串的时候要使用StringBuilder和StringBuffer的原因

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值