参考:https://blog.csdn.net/jingjbuer/article/details/42419305】
一、Java中的不可变类型
什么叫不可变类型呢?我们先看两个例子
样例1:
public class Test {
public int num;
public static void main(String[] args) {
Test t = new Test();
t.num = 11;
Test t1 = t;
t1.num = 111;
System.out.println(t.num);
}
}
//输出结果是111
样例2:
public class Test_1 {
public static void main(String[] args) {
int i = 0;
int i1 = i;
i1 = 10;
System.out.println(i);
}
}
//输出结果仍然是0
为什么如上两个例子返回的结果是不一致的呢?这就涉及到Java中的 可变数据类型 和 不可变数据类型 的概念了。
- 不可变数据类型:当该数据类型对应的变量的值发生了改变,那么它对应的内存地址也发生改变,对于这种数据类型,就称不可变数据类型。即:原有内存地址中的内容不变,为变化后的值分配了新的内存。
- 可变数据类型:当该数据类型对应的变量的值发生了改变,那么它对应的内存地址不发生改变,对于这种数据类型,就称之为可变数据类型。可变数据类型改变时实际上更改了内存中的内容。
如上样例1中: t是Test类型,属于可变数据类型。对象t和t1的值其实是一个地址,也可以看成一个指向堆内存中某个对象的指针。让t1=t时,实际上也是让t1指向t指向的对象,通过t1改变num的值,也就是改变了堆内存中的对象的值,通过t再调用时,num的值自然也是改变后的结果。
如上样例2中: 虽然i1=i的时候,i1和i共用0,但是一旦i1赋值10,此时不是将内存中的0改成10,而是又创建一个10,让i1指向10,而i还是指向0的,所以最后的结果还是0
在Java中,如下这些都是不可变数据类型(对象类型的不可变数据类型也称之为immutable Objects): /这个存在争议,貌似不是(1)所有基本数据类型(boolean、char、byte、short、int、long、float、double)。/ (2)所有基本数据类型的封装类(Boolean、Char、Byte、Short、Integer、Long、Float、Double)。 (3)String (4)其他:BigInteger、BigDecimal等 (BigInteger、BigDecimal:Java中精度最高的数据类型。这两个类支持任意精度的整数和任意精度的浮点数。)