为什么String要被设置为不可变的

为什么设置为不可变的

Java 中将 String 设计为不可变的原因有多个,主要涉及到安全、效率、同步和设计哲学

缓存

在我们的JVM中,单独开辟了一个空间来存储Java字符串,就是字符串池

        

String s1="1234";
String s2="766";

我们来看一个代码片段

在JVM中,s1和s2都会表示"1234766",所以他们都会只想字符串池子里面的同一个字符串的对象

类似于这种 ,但是之所以这么做, 就是因为字符串的不可变性,如果是可变的, 我们一旦修改了s的内容, 那么对于的s2的内容也会修改, 如果说String的对象非常之多,显然不是我们想要看到的, 这当然只是一方面

安全性

         因为字符串被广泛用于许多 Java 应用程序和框架中作为参数,包括文件路径、数据库连接信息等敏感数据。如果字符串是可变的,那么一处更改可能会影响到其他依赖于此字符串的地方,这可能导致安全漏洞或数据不一致性。所以保护String类的对于提升应用程序的安全性也是很重要的。如果是可变的,那么就表示可能随时被修改,内容就完全不能相信了。

线程安全

        不可变的特性, 其而言就是线程安全的,多个线程同时访问,不会被修改, 如果被修改, 那就是另外一个对象了,天然适合多线程的场景, 釜底抽薪,不用担心数据共享问题

HashCode缓存&性能

        

        不可变字符串也有性能优势。由于其不变性,JVM 可以对字符串进行各种优化,如字符串池(String Pool),它会复用相同的字符串字面量,减少内存消耗。此外,不可变性也使得缓存字符串的哈希值成为可能,这对提高诸如 HashMap 这样的集合类的性能非常有帮助。

        不可变性保证了字符串的值不会被改变,因为hashCode在String类中被重写,以方便缓存,第一次调用时就会计算缓存列值,返回相同的值

源码中:

        private int hash;

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值