String的不可变性如何实现?
请解释Java中String类的**不可变性(Immutability)**是如何实现的。包括类设计(final class)、字段设计(private final char[]/byte[])、以及所有修改方法返回新对象的设计模式。说明不可变性的好处。
回答
编译有声
实现方式:
- final类:String类被final修饰,不可被继承,防止子类破坏不可变性
- private final char[] value(Java 8及以前):存储字符的数组用final修饰,确保引用不可变
- Java 9+优化:改为private final byte[] value + coder(使用Latin-1或UTF-16编码)
- 没有公开修改内部状态的setter方法
- 所有修改操作返回新对象:
- concat()、replace()、substring()、toLowerCase()等都返回新String对象
- 原对象内容不受影响
- 防御性复制:构造方法中不将外部数组直接赋值给内部字段(避免外部修改)
不可变性的好处:
- 线程安全:无需同步即可在多线程共享
- 字符串常量池:字符串字面量可安全缓存和重用
- 作为HashMap的key:hashCode可缓存(String的hashCode字段懒计算并缓存),key值不变
- 安全:避免因参数修改导致的潜在安全漏洞(如文件路径、数据库连接URL)
- 类加载机制:类名用String表示,不可变性保证类加载安全