为什么 String 不可变,StringBuilder是什么
String
在 Java 中被设计成不可变类,主要有以下几个原因:
-
安全性:
- 线程安全: 由于
String
对象一旦创建就不能被修改,所以在多线程环境下,多个线程可以安全地共享同一个String
对象,无需额外的同步措施。这简化了并发编程,避免了潜在的线程安全问题。 - 防止恶意修改:
String
的不可变性可以防止恶意代码修改字符串内容,例如,在网络请求、文件路径、配置信息等场景中,保证数据的安全性。 -
性能:
-
字符串常量池优化: Java 虚拟机 (JVM) 为了优化性能,使用了字符串常量池。当创建字符串常量时,JVM 会首先检查字符串常量池中是否已经存在相同内容的字符串,如果存在,则直接返回常量池中的引用,而无需创建新的对象。由于
String
是不可变的,所以可以放心地共享常量池中的字符串,节省内存空间。 - 哈希码缓存:
String
的哈希码在创建后就不会改变,因此可以被缓存起来。在HashMap
、HashSet
等基于哈希表的集合中,可以高效地使用String
作为键,提高性能。 -
简化设计:
-
不可变性使得
String
类的设计更加简单,无需考虑对象状态变化带来的复杂性。
- 线程安全: 由于
StringBuilder 是什么?
StringBuilder
是 Java 中用于创建可变字符串的类。与 String
不同,StringBuilder
对象的内容可以被修改。
- 可变性:
StringBuilder
内部维护一个字符数组,可以动态地添加、删除、修改字符,而无需像String
那样每次操作都创建新的对象。 - 性能优势: 当需要频繁修改字符串内容时,使用
StringBuilder
比String
效率更高。因为String
的每次修改都会生成新的String
对象,造成大量的内存分配和垃圾回收开销。StringBuilder
在原对象上修改,避免了这种开销。