參考: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中精度最高的數據類型。這兩個類支持任意精度的整數和任意精度的浮點數。)