含义解释
immutable : variables that are assigned once and never reassigned.
mutable : When you assign to a variable or a field, you’re changing where the variable’s arrow points. You can point it to a different value. When you assign to the contents of a mutable value – such as an array or list – you’re changing references inside that value.
基本类型及其封装对象类型都是不可变的
图形化解释 Snapshot Diagram
mutable:
immutable:
举例
例如String和StringBuilder:
1. String是immutable的,每次对于String对象的修改都将产生一个新的String对象,而原来的对象保持不变。
2. StringBuilder是mutable,因为每次对于它的对象的修改都作用于该对象本身,并没有产生新的对象。
如何保证自己创建的类是immutable类
- .所有成员都是private final。
- 不提供对成员的改变方法,setXX
- 确保所有的方法不会被重写。手段有两种:使用final Class(强不可变类),或者将所有类方法加上final(弱不可变类)。
- 如果某一个类成员不是原始变量(例如int,double)或者不可变类,必须通过在成员初始化或者使用get方法时要通过深度拷贝方法,来确保类的不可变。
优缺点
使用不可变类型,对其频繁修改会产生大量的临时拷贝(需要垃圾回收) ;
可变类型最 少化拷贝以提高效率。
使用可变数据类型,可获得更好的性能 ,也适合于在多个模块之间共享数据 。例如全局变量。
不可变类型更“安全”, 在其他质量指标上表现更好。
对可变类型可能造成的风险,我们通过防御式拷贝(深度拷贝),给客户端返回一个全新的可变类型的对象,大部分时候该拷贝不会被客户端修改, 可能造成大量的内存浪费。
深度拷贝
当只是引用传递或者根据对象的值创建新的值,称为“浅复制”,当原对象的发生改变时,根据上面方式创建的新对象的也会随之改变;
而如果采用深度复制,那是真正的复制了一份新的对象,新对象的与原对象不存在任何关联,原对象发生改变不会影响新对象。