string常量池是在方法區(qū)中嗎 字符串常量池是在方法區(qū)中還是在獨立的區(qū)域中?
字符串常量池是在方法區(qū)中還是在獨立的區(qū)域中?String STR=“nihao”當(dāng)程序開始執(zhí)行此代碼時,它必須創(chuàng)建一個對象,但是在創(chuàng)建對象之后,它是一個常量,不能更改,并且對象被放置在字符串池中,這就
字符串常量池是在方法區(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對象,一個是string常量對象,它存儲在字符串池中
如果您查看字符串源代碼,您可以看到它是一個對象
!s=“123”
寫這句話時,您將首先找出常量池中是否有字符串對象123。如果沒有,他將開始提取,1,2,3
然后將其拼接成一個對象,即“123”
如果有另一個對象需要這個對象,例如S1=“123”
此時,在操作S1時,最好去常量池看看是否有這個對象。如果有,您可以直接獲取地址,因為常量池數(shù)據(jù)是共享的
如果此時S1=“1234”則常量池不可用,您將再次提取1、2、3、4,然后將其重新組合為新對象并放入常量池中
!字符串源代碼包含一個專用變量。字符類型數(shù)組用于提取這些單個字符,然后將它們拼接到字符串對象中
字符串常量池到底存放的是字符串引用還是字符串對象?
它可以理解為內(nèi)存中字符串類型變量的一個特殊區(qū)域,例如字符串a(chǎn)=“ABC”當(dāng)您定義這樣一個變量時,Java將首先轉(zhuǎn)到常量池以查找是否存在類似“ABC”的字符串。如果有,它會直接把內(nèi)存地址給a,否則它會生成一個字符串“ABC”,下一個字符串B=當(dāng)使用“ABC”時,發(fā)現(xiàn)常量池中已經(jīng)有“ABC”。這時,JVM不會再生成“ABC”,而是直接把它交給“ABC”來引用B,這樣您就會發(fā)現(xiàn)a==B