[转载]https://www.cnblogs.com/dolphin0520/p/10693891.html
不可变对象的意义:
1.让并发编程变得更简单
get线程安全,set线程不安全,不可变对象不能set,没有setter()。
2.消除副作用
3.减少容器使用过程出错的概率
使用HashSet时,如果HashSet中元素对象的状态可变,就会出现元素丢失的情况。如Person jack,修改了jack的age,后.contains(jack)就会false,因为改变了对象。
Person jack = new Person();
Person jack1 = jack;
jack.setAge(10);
jack.setIdentityCardID("42118220090315234X");
Set<Person> personSet = new HashSet<>();
personSet.add(jack);
jack.setAge(11);
Person jack2 = jack;
System.out.println("personSet contains jack:" + personSet.contains(jack)); //false
System.out.println("jack1 == jack2:" + (jack1 == jack2)); //true
所以在Java中,对于String、包装器这些类,我们经常会用他们来作为HashMap的key。
4.如何编写不可变对象
补充知识:参数绑定,照常以引用和基本数据类型分析。
如this.name = String[] name,如在类外部改变name中的引用指向的对象,this.name也会改变,因为传递的是整个name字符串数组,this.name实际上指向的是一个引用的数组,与name内部的引用对应哪个实例无关。
如this.name = name,外部改变name,this.name不变,因为name指向的是实例,this.name也指向该实例,而非上面的引用。