string 字串不可變的特性
- 當你給字串賦值的時候,舊的資料並不會銷毀,而是在Heap(堆積)重新開辟一塊空間儲存新值,同時也產生很多內存垃圾。(所以,字串一旦聲明了就不再可以改變。)
- 當程式結束後,GC掃描整個內存,如果發現有的空間沒有被指向,則立即把它銷銷。
int & string
int是 ValueType(值類型),string是 ReferenceType(參考類型)。- ValueType(值類型)是擺在
Stack(堆疊/棧)中,ReferenceType(參考類型)是擺在Heap(堆積/堆)中。
舉例 int 和 string
int類型是Value Type, 是Stack(堆疊/棧)存放資料的記憶體方式。
int 重新賦值後,舊值被覆蓋沒了,變新值
1
2
int n = 10;
n = 20; //10沒了,同一個位置儲20了
string 類型是Reference Type, 是Heap(堆積/堆)存放資料的記憶體方式。
string 重新賦值後,舊值”小明”還在;,只是在heap 中再開辟一塊空間儲存”小王”,s重新指向”小王”
1
2
string s = "小明"; //舊值
s = "小王"; //舊值還在,只是在heap 中再開辟一塊空間儲存新值"小王"
所以如果對string有大量的「重新賦值」、「拼接」、「刪除」,只要每操作一次,只要它的值一發生改變,都會在heap(堆積)中重新開辟一塊空間,就會產生很多的內存垃圾。
先不管它怎麼處理內存垃圾,GC(堆積)都會把在heap中沒有指向的值銷毀
GC什麼時候做呢?
當程式結束後,GC會掃描整個內存,如果發現在有空間沒有被指向,則立即把它銷毀。
垃圾回收:Garbage Collection,縮寫為GC
Stack(堆疊/棧), Heap(堆積/堆)
內存/記憶體空間
如果兩個字串都儲存相同的值呢?
1
2
string s1 = "小明";
string s2 = "小明";
s1和s2 在Stack中,都是指向同一塊Heap空間
當s1 改為”張三”後,會重新賦值,Heap會開辟一個新的空間叫”張三”,s1重新指向它
怎麼驗証它?
在即時運算視窗輸入 & s1 & s2
1
2
3
4
5
6
7
& s1
0x000000340897e5d8 //佔存地址
*& s1: 0x000001abaddeca58 //追蹤地址
& s2
0x000000340897e5d0
*& s2: 0x000001abaddeca58
追蹤地址是一樣的
R Note
可以對它理解,每對string 重新賦值,加一個字符,減一個字符…等等,每一個任何操作,只要操作一次,就會在內存當中開辟一塊新的空間。
string 只要對它有任何的操作,就會在內存(記憶體空間)當中開辟一塊新的空間。
參考類型(ReferenceType): 裝箱(Boxing) & 拆箱(Unboxing)
Boxing(裝箱):
將堆疊(stack)中的值複製到堆積(heap)中的行為,就叫Boxing(裝箱)。
Unboxing(拆箱):
反過來說,將堆積(heap)中的值,複製到堆疊(stack)中的行為,就叫Unboxing(拆箱)。