字符串常量池在堆中還是方法區(qū) 字符串常量池到底存放的是字符串引用還是字符串對象?
字符串常量池到底存放的是字符串引用還是字符串對象?如果你看字符串的源代碼,你會發(fā)現(xiàn)它是一個對象!s=“123”寫這句話時,您將首先找出常量池中是否有字符串對象123。如果沒有字符串對象123,他將開始
字符串常量池到底存放的是字符串引用還是字符串對象?
如果你看字符串的源代碼,你會發(fā)現(xiàn)它是一個對象
!s=“123”
寫這句話時,您將首先找出常量池中是否有字符串對象123。如果沒有字符串對象123,他將開始提取,1,2,3
然后將其拼接成一個對象,即“123”
如果還有另一個對象也需要這個對象,例如S1=“123”
此時,操作S1時應(yīng)先到常量池中查找是否有這個對象,如果有,取直接尋址,因為常量池數(shù)據(jù)是共享的,
如果此時S1=“1234”則常量池不存在,它將被再次提取,1、2、3、4,然后重新組裝成常量池中的新對象
字符串常量池是在方法區(qū)中還是在獨立的區(qū)域中?
string STR=“nihao”當(dāng)程序開始執(zhí)行此代碼時,它必須創(chuàng)建一個對象,但在創(chuàng)建對象之后,它是一個不能更改的常量,并且對象被放入字符串池,即,你說的常量池
如果我以后再寫代碼:String Other=“nihao”
STR和Other的地址是一樣的,因為STR和Other的聲明方式是一樣的。創(chuàng)建STR對象時,如果字符串池中沒有“nihao”常量,請創(chuàng)建一個。創(chuàng)建其他對象時,發(fā)現(xiàn)字符串池中有一個“nihao”常量,直接使用即可
string B1=New string(“nihao”)
但如果用上述方法直接New string(),則A1和B1引用的對象不在字符串池中,而是在堆中。但是,new string()的參數(shù)“nihao”也是一個字符串。這根繩子是從哪里來的?如果我們拆分代碼,我們會理解它:
string A1=new string(para)
會發(fā)現(xiàn)代碼字符串A1=new string(“nihao”)實際上創(chuàng)建了兩個對象,一個是string object,存儲在堆中,另一個是string constant object,存儲在字符串池中