字符串常量池在堆中還是方法區(qū) 字符串常量池到底存放的是字符串引用還是字符串對象?
字符串常量池到底存放的是字符串引用還是字符串對象?如果你看字符串的源代碼,你會發(fā)現(xiàn)它是一個對象!s=“123”寫這句話時,您將首先找出常量池中是否有字符串對象123。如果沒有字符串對象123,他將開始
字符串常量池到底存放的是字符串引用還是字符串對象?
如果你看字符串的源代碼,你會發(fā)現(xiàn)它是一個對象
!s=“123”
寫這句話時,您將首先找出常量池中是否有字符串對象123。如果沒有字符串對象123,他將開始提取,1,2,3
然后將其拼接成一個對象,即“123”
如果還有另一個對象也需要這個對象,例如S1=“123”
此時,操作S1時應先到常量池中查找是否有這個對象,如果有,取直接尋址,因為常量池數(shù)據(jù)是共享的,
如果此時S1=“1234”則常量池不存在,它將被再次提取,1、2、3、4,然后重新組裝成常量池中的新對象
!字符串源代碼有一個私有變量,字符類型數(shù)組,用于提取這些單個字符,然后將其拼接到字符串對象中
字符常量池是什么意思?
它可以理解為內存中專門為字符串類型變量打開的區(qū)域。例如,string a=“ABC”定義這樣一個變量時,Java會先到常量池中查找是否有像“ABC”這樣的字符串,如果有,直接把內存地址給a,否則會生成一個字符串“ABC”。當下一個字符串B=“ABC”時,發(fā)現(xiàn)常量池已經(jīng)有了“ABC”。這時JVM不會再生成“ABC”,而是直接引用“ABC”來引用B,所以這時你會發(fā)現(xiàn)a==B
string STR=“nihao”程序開始執(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”)
但是如果我們使用上述方法直接創(chuàng)建一個新字符串(),則A1和B1引用的對象不在字符串池中,而是在堆中。但是,new string()的參數(shù)“nihao”也是一個字符串。這根繩子是從哪里來的?如果我們拆分代碼,我們可以看到字符串A1=new string(para)]的代碼實際上創(chuàng)建了兩個對象,一個是字符串對象,存儲在堆中,另一個是字符串常量對象,存儲在字符串池中
Java常量池不在堆或堆棧中,這是獨立的內存空間管理。
1. 堆棧:它存儲基本類型變量數(shù)據(jù)和對象引用,但對象本身不存儲在堆棧中,而是存儲在堆(新對象)或常量池(字符串常量對象存儲在常量池中)。堆:存儲所有新對象。
3. 常量池:存儲字符串常量和基本類型常量(publicstaticfinal)。
對于字符串:其對象的引用存儲在堆棧中。如果它們是在編譯時創(chuàng)建的(直接用雙引號定義),則它們存儲在常量池中。如果只能在運行時(New)確定它們,則將它們存儲在堆中。對于相等的字符串,常量池中總是只有一個副本,堆中總是有多個副本。