Java数据类型的可变与不可变

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

二、String&StringBuilder看可变不可变
String:不可变数据类型
StringBuilder:可变数据类型

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

String s = "a";  s = s + "b";
//其中s指向了两个内存地址 ,一个地址中是“a” 另一个是 “ab”

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

Java数据类型的可变与不可变_第1张图片Java数据类型的可变与不可变_第2张图片

其他差别
不可变数据类型:对其修改会产生大量的临时拷贝(需要垃圾回收)
可变数据类型:最少化拷贝以提高效率,可以共享数据

三、可变数据使用风险

//传参传递可变数据类型
//计算List所有数据绝对值之和
//风险:更改了list中的值
public static int sumAbsolute(List list) {
    for(int i = 0; i < list.size(); i++) 
      list.set(i,Math.abs(list.get(i)));
    return sum(list);

四、关于hashCode 和 equals
对于可变数据类型在非必须的情况下尽量不要重写这两个函数,使用原始的即可(比较内存是否相同),对于不可变数据类型,在重写equals时一定要重写hashCode否则若hashCode不相同时不会继续比较Equals。

你可能感兴趣的:(Java数据类型的可变与不可变)