1. 程式人生 > >淺談String是不可變的,那麼String s = "aaa",為什麼同樣可以執行 s = "bbb"

淺談String是不可變的,那麼String s = "aaa",為什麼同樣可以執行 s = "bbb"

什麼是不可變物件?

眾所周知, 在Java中, String類是不可變的。那麼到底什麼是不可變的物件呢? 可以這樣認為:如果一個物件,在它建立完成之後,不能再改變它的狀態,那麼這個物件就是不可變的。不能改變狀態的意思是,不能改變物件內的成員變數,包括基本資料型別的值不能改變,引用型別的變數不能指向其他的物件,引用型別指向的物件的狀態也不能改變。

問題:

		
		String s = "ABCabc";
		System.out.println("s = " + s);
		
		s = "123456";
		System.out.println("s = " + s);

輸出結果為:

既然String是不可變的,那麼String s = "ABCabc",為什麼同樣可以執行 s = "123456"呢

原因:首先建立一個String物件s,然後讓s的值為“ABCabc”, 然後又讓s的值為“123456”。 從列印結果可以看出,s的值確實改變了。那麼怎麼還說String物件是不可變的呢? 其實這裡存在一個誤區: s只是一個String物件的引用,並不是物件本身。物件在記憶體中是一塊記憶體區,成員變數越多,這塊記憶體區佔的空間越大。引用只是一個4位元組的資料,裡面存放了它所指向的物件的地址,通過這個地址可以訪問物件。 也就是說,s只是一個引用,它指向了一個具體的物件,當s=“123456”; 這句程式碼執行過之後,又建立了一個新的物件“123456”, 而引用s重新指向了這個心的物件,原來的物件“ABCabc”還在記憶體中存在,並沒有改變。記憶體結構如下圖所示: