Blog Detail

  • 可变数据类型(mutable)与不可变数据类型(immutable)总结

    一、基本概念

    不可变数据类型: 当该数据类型的对应变量的值发生了改变,那么它对应的内存地址也会发生改变,对于这种数据类型,就称不可变数据类型。其中基本数据类型都是不可变数据类型,例如int,如果一个int类型的数据发生改变,那么它指向了内存中的另一个地址,但是需要注意的是java缓存了所有-128-127的值。

    可变数据类型 :当该数据类型的对应变量的值发生了改变,那么它对应的内存地址不发生改变,对于这种数据类型,就称可变数据类型,当可变数据类型改变时它实际上是更改了内存中的内容。

    二.可变与不可变数据类型分别有什么优势?

    1)可变数据类型:

    由于对不可变数据类型进行修改会产生大量的临时拷贝,很占用空间,相比之下可变数据类型可以将拷贝最少化从而提高效率。

    一个程序较多的的使用可变数据类型,会获得更好的性能。

    这种类型也适合于在多个模块之间共享数据。

    2)不可变数据类型:

    不可变类型更安全,用户或其他人访问时,对类中的元素不会进行修改,从而保证程序的正确性,在项目中可以更好地保存。

    存在对一个对象的多次引用时,采用不可变类型是明智的,否则对该对象修改时,同时会改变其他几个类的引用,会出现大错。

    三.通过final修饰可变类型为不可变类型

    通过final修饰的类有以下三个特征:无法被继承、无法被覆盖以及重写、无法改变其引用。

    四、String&StringBuilder看可变不可变

    String:不可变数据类型

    StringBuilder:可变数据类型

    String s = "a"; s = s + "b";

    //其中s指向了两个内存地址 ,一个地址中是“a” 另一个是 “ab”

    StringBuilder sb = "a"; sb = "ab";

    //StringBuilder是可变数据类型,更改它的时候sb始终指向一个位置

    更改对象的值

    不可变数据类型是在重新将引用指向一个新地址,新地址中为更改后的值。 可变数据类型则在原来的地址上直接更改对象值。

    总的来说,基本数据类型和对象数据类型的变量均代表在栈内存中的一段存储空间,但不同的是,基本数据类型变量的对应空间直接存储数据,而对象数据类型变量的对应空间则存储其在堆内存中的地址,而在堆内存中存储数据。这就导致了二者的引用类型不同。