Java 面试题
目录

Java 中 String 为什么是不可变的?

· 约 3 分钟读完 · 第 26 / 274 章

推荐答案

在 Java 中,String 是不可变的,这意味着一旦一个 String 对象被创建,它的值就不能被改变。这种设计有以下几个主要原因:

  1. 安全性:不可变性使得 String 对象在多线程环境下是线程安全的,因为它们的值不会被修改。
  2. 缓存哈希值:String 类内部缓存了哈希值,因为 String 是不可变的,所以哈希值在对象创建时计算一次后就不会改变,这提高了哈希表等数据结构的性能。
  3. 字符串池:Java 使用字符串池来存储字符串字面量,不可变性使得相同的字符串字面量可以共享同一个 String 对象,从而节省内存。
  4. 安全性:不可变性还使得 String 可以作为安全的参数传递给方法,而不必担心方法内部会修改字符串的内容。

本题详细解读

1. 不可变性的定义

不可变性意味着一旦一个对象被创建,它的状态(即它的数据)就不能被修改。对于 String 类来说,这意味着一旦一个字符串被创建,它的字符序列就不能被改变。

2. String 类的实现

String 类在 Java 中是通过 final 关键字修饰的,这意味着 String 类不能被继承。此外,String 类内部使用一个 char 数组来存储字符序列,并且这个数组也是 final 的,这意味着一旦数组被初始化,就不能再指向另一个数组。

3. 字符串池

Java 使用字符串池来存储字符串字面量。当创建一个字符串字面量时,JVM 会首先检查字符串池中是否已经存在相同的字符串。如果存在,则返回池中的引用;如果不存在,则在池中创建一个新的字符串对象并返回其引用。由于 String 是不可变的,这种共享机制是安全的。

4. 线程安全

由于 String 是不可变的,多个线程可以同时访问同一个 String 对象而不需要额外的同步机制。这使得 String 在多线程环境下是线程安全的。

5. 哈希值缓存

String 类内部缓存了哈希值,因为 String 是不可变的,所以哈希值在对象创建时计算一次后就不会改变。这提高了哈希表等数据结构的性能,因为哈希值不需要每次都重新计算。

6. 安全性

不可变性还使得 String 可以作为安全的参数传递给方法,而不必担心方法内部会修改字符串的内容。这在处理敏感数据(如密码)时尤为重要。

通过以上几点可以看出,String 的不可变性在 Java 中有着重要的设计意义,它不仅提高了性能,还增强了安全性和线程安全性。