Skip to content

String 为什么要设计成不可变的

String被设计成不可变的有以下几个原因:

  1. 线程安全:由于String是不可变的,多个线程可以同时访问同一个String对象而无需担心数据被修改。这使得String在多线程环境下是线程安全的。
  2. 缓存Hash值:由于String是不可变的,它的hashCode可以缓存,将String用作Key在哈希表中查找时,由于hashCode不变,可以加快查找速度。
  3. 安全性:String在很多安全框架和API中广泛使用,如密码学中的加密操作。如果String是可变的,攻击者可以修改String中的值,对应用程序的安全性造成潜在的风险。
  4. Hash值不变性:当拥有对String对象的引用时,无法更改String对象的内容,这意味着String对象可以被安全地用作哈希表中的Key,而保持哈希值的不变性。
  5. 效率:由于String是不可变的,可以在多个地方共享相同的String对象,避免了重复创建字符串对象的开销,提高了Java程序的性能和效率。

尽管String是不可变的,但在实际使用中如果需要频繁地进行字符串拼接等操作,可以使用StringBuilder或StringBuffer类来提高效率,因为它们可以修改字符串内容。但在多线程环境下,应优先考虑使用StringBuffer而非StringBuilder,因为StringBuffer是线程安全的。

更新: 2023-08-24 22:12:20
原文: https://www.yuque.com/tulingzhouyu/db22bv/ei6txm9nlv9ldlgm

短视频

String为什么被设计成不可变? 啥是不可变? 啊?

20251206233438eb774a81f.png

今天一个小伙伴去面试被问到这个问题结果一脸懵逼。 我想说如果这种基础的问题都不知道那真的劝你们先准备好再去不要浪费机会, 现在的环境机会丢一个就少一个。

哈喽大家好我是徐庶,需要面试的小伙伴可以再评论区扣666领取我给你们准备的面试资料, 我来给大家普及下这个问题。

首先为什么说String是不可变呢? 有同学说我给他赋值不就变了吗? 这里的不可变啊。。指的是 String变量指向内存的值不可变,说白了, String是对象,值是通过一个final修饰的char[],是不能改的! 要改只能重新new 一个String。 举个例子, 将Hello赋给一个String类型变量, 然后 再追加World字符串, 实际上是创建了一个新的字符串对象 "Hello World",然后将 变量指向这个新对象。原始的 "Hello" 字符串对象仍然存在于内存中,直到垃圾回收器将其回收。

java
String str = "Hello";
str += " World";  // 这里实际上创建了一个新的 String 对象 "Hello World"

那String为什么要设计成这种宁愿指向一个新的内存 也不肯改变原值呢? :

原因有几点:

  1. 保证安全性:

由于String是不可变的,它们的值在创建后就不会发生变化。 可以防止恶意代码篡改。

  1. 保证线程安全:

由于String是不可变的, 当多个线程共享同一个字符串时 因为持有的是String的引用地址,所以可以保证可重复读。

  1. 保证性能:

Java 中的字符串常量池机制依赖于字符串的不可变性。这样做可以节省内存,因为相同内容的字符串只需存储一个副本。每次创建一个新的字符串字面量时,都会先检查池中是否已经存在,如果存在则直接返回该引用,这样就避免重复创建相同的字符串对象。

看完视频如果对你有帮助记得三连支持哦, 下期见!

更新: 2024-06-07 13:34:55
原文: https://www.yuque.com/tulingzhouyu/db22bv/dmi0befubgtft22n