为什么 String 不可变,StringBuilder是什么

String 在 Java 中被设计成不可变类,主要有以下几个原因:

  1. 安全性:

    • 线程安全: 由于 String 对象一旦创建就不能被修改,所以在多线程环境下,多个线程可以安全地共享同一个 String 对象,无需额外的同步措施。这简化了并发编程,避免了潜在的线程安全问题。
    • 防止恶意修改: String 的不可变性可以防止恶意代码修改字符串内容,例如,在网络请求、文件路径、配置信息等场景中,保证数据的安全性。
    • 性能:

    • 字符串常量池优化: Java 虚拟机 (JVM) 为了优化性能,使用了字符串常量池。当创建字符串常量时,JVM 会首先检查字符串常量池中是否已经存在相同内容的字符串,如果存在,则直接返回常量池中的引用,而无需创建新的对象。由于 String 是不可变的,所以可以放心地共享常量池中的字符串,节省内存空间。

    • 哈希码缓存: String 的哈希码在创建后就不会改变,因此可以被缓存起来。在 HashMapHashSet 等基于哈希表的集合中,可以高效地使用 String 作为键,提高性能。
    • 简化设计:

    • 不可变性使得 String 类的设计更加简单,无需考虑对象状态变化带来的复杂性。

StringBuilder 是什么?

StringBuilder 是 Java 中用于创建可变字符串的类。与 String 不同,StringBuilder 对象的内容可以被修改。

  • 可变性: StringBuilder 内部维护一个字符数组,可以动态地添加、删除、修改字符,而无需像 String 那样每次操作都创建新的对象。
  • 性能优势: 当需要频繁修改字符串内容时,使用 StringBuilderString 效率更高。因为 String 的每次修改都会生成新的 String 对象,造成大量的内存分配和垃圾回收开销。StringBuilder 在原对象上修改,避免了这种开销。