不可變類的意思是創建該類的實例後,該實例的實例變數是不可改變的。Java提供的8個包裝類和String類都是不可變類。因此String和8個包裝類都具有不可變性。 就拿String類來說,通過閱讀String類的源碼我們可以發現其實整個String類是被final所修飾,而其用來存儲值的底層實際上是 ...
不可變類的意思是創建該類的實例後,該實例的實例變數是不可改變的。Java提供的8個包裝類和String類都是不可變類。因此String和8個包裝類都具有不可變性。
就拿String類來說,通過閱讀String類的源碼我們可以發現其實整個String類是被final所修飾,而其用來存儲值的底層實際上是一個私有final類型的字元數組,因此在JVM運行的時候是把“hello”當成常量存儲在運行時常量池內部。
public class UnChange { public static void main(String[] args) { String s1 = "hello"; String s2 = "hello"; System.out.println(s1 == s2); } } 輸出結果: true
上述代碼在JVM當中其實是這樣子的,其實只有一個“hello”常量,而變數s1和s2都指向同一個“hello”常量。
public class UnChange { public static void main(String[] args) { String s1 = "hello"; String s2 = "hello"; Integer n1 = 100; Integer n2 = 100; s2+=" world"; n2+=2; System.out.println("s1="+s1); System.out.println("s2="+s2); System.out.println("n1="+n1); System.out.println("n2="+n2); } } 輸出結果: s1=hello s2=hello world n1=100 n2=102
在JVM當中如圖所示:s1和s2一開始指向的都是“hello”,n1和n2一開始指向的都是100
後來通過s2+=" world"; n2+=2;又分別在常量池和堆當中創建了“hello world”和102實例,並且重新改變了變數s2和n2的指向。