java不可变类和不可变对象
Posted zhangjin1120
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java不可变类和不可变对象相关的知识,希望对你有一定的参考价值。
什么是不可变对象?
下面是《Effective Java》这本书对于不可变对象的定义:
不可变对象(Immutable Object):对象一旦被创建后,对象所有的状态及属性在其生命周期内不会发生任何变化。
不可变对象就是不可变类的实例,那么什么是不可变类?从程序的角度讲:
- 类一般用final修饰,不可被继承。
- 类中不提供set方法,修改对象属性
- 如果要修改方法,需要创建一个新的对象,然后修改状态。
常见的不可变类有哪些?
String,八大包装类
不可变对象的好处是什么?
-
有利于线程安全:某个线程修改不可变对象时,会生成新的对象。原有的对象不会发生改变,所以其他线程中的引用,所指向的对象,并没有改变。就不会出现因为一个线程,修改了对象的属性,其他线程功能出现异常。
看下面的代码,就清楚了。public class StringTest { public static void main(String[] args) { String s = "ABC"; String s2 = s; s = s.toLowerCase(); System.out.println(s); System.out.println(s2); System.out.println(s==s2); } }
运行结果:
-
不可变类更适合用做HashMap的key。
如果HashMap的Key的哈希值,在存储键值对后发生改变,HashMap可能再也查找不到这个Entry了。 说的再详细些,key如果是可变对象,对象属性被修改,可能hash值也会变(这里只是可能,如果没有重写hashCode(),hash值没有变),HashMap就找不到对应的Entry了。还是不清楚的话,参考:HashMap的key可以是可变的对象吗?。
另外,可变类也可以做HashMap的key类型,不是绝对不可以,如果绝对不可以的话,HashMap肯定会做限制。
可变类作为key还会存在另外一个问题,如果key对象的属性发生了变化,但是程序员忘了重写hashCode方法,哈希值并没有变,导致不同的key能够查出同一个value。这也是不合理的。
以上是关于java不可变类和不可变对象的主要内容,如果未能解决你的问题,请参考以下文章