Java不可变对象、不可变对象作为容器的key

[转载]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也指向该实例,而非上面的引用。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。