为什么设置为不可变的
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;