栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

java不可变类和不可变对象

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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中的不可变对象

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/357942.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号