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

78 阅读1分钟

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

回答

  • 这个问题,可以从下面几方面来讨论
1. 缓存
  • 字符串是使用最广泛的数据结构。大量的字符串的创建是非常耗费资源的,所以,Java提供了对字符串的缓存功能,可以大大的节省堆空间

  • JVM 专门开辟了一部分空间来存储 Java 字符串。就是字符串池

    参考:Java 八股/09-JVM/030-字符串常量池.md

  • 例子

image-20250325174003253

img

  • 之所以可以实现缓存功能,主要是因为字符串的不变性。
2. 安全性
  • 在程序中传递一个字符串的时候。
  • 如果,这个字符串的内容是不可变的,那么,我们就可以相信这个字符串中的内容。
  • 如果,是可变的,这个字符串内容可能随时都被修改。那么,这个字符串内容就完全不可信了。
3. 线程安全
  • 不可变性自动使字符串成为线程安全的。

    当从多个线程访问它们时,它们是不会被更改。

4. hashcode 缓存
  • 不可变性保证了字符串的值不会改变。所以,hashCode() 方法计算的字符串的 hash 码也是不变的,这样就可以很方便的把 hash 缓存下来。

  • // String#hash 字段
    /** Cache the hash code for the string */
    private int hash; // Default to 0
    
5. 性能
  • 字符串池缓存,字符串 hash 码缓存等,都是为了字符串操作更加高效。