不可变类(Immutable Objects):当类的实例一经建立,其内容便不可改变,即没法修改其成员变量。缓存
可变类(Mutable Objects):类的实例建立后,能够修改其内容。安全
Java 中八个基本类型的包装类和 String 类都属于不可变类,而其余的大多数类都属于可变类。多线程
ps: 某个对象在被建立后其状态就不能被修改,那么这个对象就称为不可变对象,不可变对象必定是线程安全的。不可变对象很简单。他们只有一种状态,而且该状态由构造函数来控制。函数
须要特别注意的是,不可变类的不可变是指该类的实例不可变而非指向该实例的引用的不可变。性能
当知足如下条件时,对象才是不可变的:this
(1)对象建立之后其状态就不能改变;spa
(2)对象的全部域都是final类型;线程
(3)对象是正确创造的(在对象建立期间,this引用没有溢出)。指针
一个不可变类的定义应当具有如下特征:对象
1. 优势:效率和安全。
1. 当一个对象是不可变的,那么须要拷贝这个对象的内容时,就不用复制它的自己而只是复制它的地址,复制地址(一般一个指针的大小)只须要很小的内存空间,具备很是高的效率。同时,对于引用该对象的其余变量也不会形成影响。
2. 不变性保证了hashCode 的惟一性,所以能够放心地进行缓存而没必要每次从新计算新的哈希码。而哈希码被频繁地使用, 好比在hashMap 等容器中。将hashCode 缓存能够提升以不变类实例为key的容器的性能。
线程安全
在多线程状况下,一个可变对象的值极可能被其余进程改变,这样会形成不可预期的结果,而使用不可变对象就能够避免这种状况同时省去了同步加锁等过程,所以不可变类是线程安全的。
2. 缺点:不可变类的每一次“改变”都会产生新的对象,所以在使用中不可避免的会产生不少垃圾。