字串在常量池中如何存放

2021-09-26 14:46:17 字數 1360 閱讀 9470

字串在常量池中如何存放

string s1=」hello」;

s1=」zhangsan」;

string s2=」zhangsan」;

string s3=new string(「zhangsan」);

string s4=new string(「zhangsan」);

string s5=s1+」zhangsan」;

上面的這些字串,字面量會放到字串常量池中,也就是你在**中能直接看到的字串,直接賦給乙個變數的那些;

s5就不會把整個拼接後的放到常量池中,因為他不是直接寫明的,你也需要看看s1代表的是什麼,這其中你的大腦就經過了一次轉換,就是將s1轉換為hello,但電腦就不會轉換。所以這樣引用s1就不算字面量,所以常量池中沒有hellozhangsan這個字串。

兩字串相加本質就是()你可以用xjad工具檢視你編譯後的**:生成stringbuilder物件將其拼接起來再呼叫tostring()方法返回新的字串hellowzhangsan(hello就是s1指向常量池中的字串複製過來的,zhangsan也是s2指向常量池中的字串複製過來的,都放到stringbuilder物件中的陣列裡)(呼叫tostring()方法生成新的string,其實就是將stringbuilder中陣列裡的字元全都拷貝到新string裡的陣列裡),堆中字串是乙個value陣列,裡面裝著hellozhangsan,但它不會把hellozhangsan整個字串放到常量池中。

s5.inturn();方法作用:如果s5這個字串在常量池中存在,就返回常量池中字串的位址,如果不存在就將此字串在堆中的位址放到常量池中。此時就會將hellozhangsan作為整體放到常量池中

我們可以用反射驗證一下a和b是不是指向常量池中同乙個陣列字串,我圖中沒寫,你可以反射後多加一句列印字串b的值,這時候你可以發現,b的值改變了,也變成了zaa;

stringbuilder中的tostring(): 這句**就是將stringbuilder中裝字串的陣列複製到string類物件的陣列中,形成新的字串物件

常量,字串常量

對於普通變數常量 常量摺疊 是 就是在編譯器進行語法分析的時候,將常量表示式計算求值,並用求 得的值來替換表示式,放入常量表。可以算作一種編譯優化 include void main 輸出 3 2 我只是改了這個位址內容,但是e還是2,因為編譯器在優化的過程中,會把碰見的const全部以內容替換掉 ...

字串常量

1.當乙個字串常量出現於表示式中時,它的值是乙個指標常量。編譯器被這些指定字元的乙份拷貝儲存在記憶體的某個位置,並儲存乙個指向第乙個字元的指標。陣列名用於表示式中時,它的值也是指標常量 2.xyz 1 因為字串常量實際上是個常量指標,這個表示式計算 指標值加上1 的數值。它的結果是個指標,指向字串中...

字串常量

來自 常量字串為什麼位於靜態儲存區?char c chenxi 書上說 chenxi 這個字串被當作常量而且被放置在此程式的記憶體靜態區。那一般的int i 1 1也是常量,為什麼1就不被放置在此程式的記憶體靜態區了呢?請高手指點!所有的字元竄常量都被放在靜態記憶體區 因為字串常量很少需要修改,放在...