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

以上是关于java不可变类和不可变对象的主要内容,如果未能解决你的问题,请参考以下文章

java中是啥是不可变对象和可变对象

Java中的String为什么要设计成不可变的?

String 和 Stringbuild

Android面试复习总纲

Python 可变对象和不可变对象

不可变类