CodeWalk

String的不可变性如何实现?

作者:编译有声 · 2026-05-30 12:55

请解释Java中String类的**不可变性(Immutability)**是如何实现的。包括类设计(final class)、字段设计(private final char[]/byte[])、以及所有修改方法返回新对象的设计模式。说明不可变性的好处。

回答

编译有声

实现方式

  1. final类:String类被final修饰,不可被继承,防止子类破坏不可变性
  2. private final char[] value(Java 8及以前):存储字符的数组用final修饰,确保引用不可变
  3. Java 9+优化:改为private final byte[] value + coder(使用Latin-1或UTF-16编码)
  4. 没有公开修改内部状态的setter方法
  5. 所有修改操作返回新对象
    • concat()、replace()、substring()、toLowerCase()等都返回新String对象
    • 原对象内容不受影响
  6. 防御性复制:构造方法中不将外部数组直接赋值给内部字段(避免外部修改)

不可变性的好处

  • 线程安全:无需同步即可在多线程共享
  • 字符串常量池:字符串字面量可安全缓存和重用
  • 作为HashMap的key:hashCode可缓存(String的hashCode字段懒计算并缓存),key值不变
  • 安全:避免因参数修改导致的潜在安全漏洞(如文件路径、数据库连接URL)
  • 类加载机制:类名用String表示,不可变性保证类加载安全