什么是不可变类
不可变类是指一旦创建对象后,其状态(属性值)就不能被修改的类。
一个不可变类具有以下特征:
- 类的实例变量声明为私有的,并且没有提供修改这些变量值的公共方法。
- 类是final的,防止被继承。
- 类的实例变量声明为final,一旦被初始化后就不能再修改。
- 没有提供修改状态的公共方法。
不可变类的优点是:
- 线程安全:由于不可变类的状态不变,所以不需要额外的同步机制来保护对象的一致性。
- 缓存优化:由于不可变类的对象是不可变的,可以在需要时进行缓存,以提高性能。
- 安全性:不可变类可以保证对象的一致性,避免了意外的状态修改。
常见的不可变类包括String、Integer包装类、BigDecimal等。这些类都具有不可变性,即一旦创建后,它们的值将不会被修改。
为什么 Java 中 String 是不可变类?
1、String 类中包含 char 数组 value、整形的 offset 和 count 三个属性,这三个属性都是 private 的,且没有提供方法修改数值,因此在初始化后无法从外部改变。
2、String 类中的这三个属性都是被 final 修饰的,无法从内部进行改变;
3、方法区有一块特殊存储区域 String Pool(字符串常量池),当创建 String 时,如果在 String Pool 中找到相同的字符串值,则会返回一个已存在 String 的引用而不会新建一个对象。假设 String 是可变的,则会导致其他引用这个字符串值的 String 的值发生变化。