在Java程序中經(jīng)常會(huì)遇到類似于"Hello"這樣地字符串,那么這種類型的字符串是Java中是如何存儲(chǔ),下面就來討論一下字符串常量在內(nèi)存中的存儲(chǔ)方式
Java程序在編譯時(shí)會(huì)將程序中出現(xiàn)的常量(包括:char、byte、short、int、long、boolean和String類型)放到一個(gè)叫做常量池的地方。常量池也稱為對(duì)象池,顧名思義常量池中存儲(chǔ)的是對(duì)象。
那么在源程序中檢測(cè)到"Hello"這樣地常量字符串之后,編譯器都干了些什么:
首先,在常量池中創(chuàng)建一個(gè)String對(duì)象,該對(duì)象的內(nèi)存分布如下圖:
這里就需要提一下String定義的兩個(gè)變量:
private final char value[];//The value is used for character storageprivate int hash;//Cache the hash code for the string
其中第一個(gè)就是實(shí)際存儲(chǔ)字符串的數(shù)組,所有字符串最終的存儲(chǔ)形式都是字符數(shù)組。從上圖中可以很清晰的看出,實(shí)際的字符數(shù)組還是存儲(chǔ)在堆中,常量池中存儲(chǔ)的是String對(duì)象。
當(dāng)執(zhí)行String str="Hello",只是將常量池中"Hello"對(duì)象的地址賦給了str。
除了上面這個(gè)字符串常量的內(nèi)存模型需要理清之外,String類還有幾個(gè)很常用的構(gòu)造函數(shù),也需要對(duì)內(nèi)存模型非常熟悉:
public String(){this.value="".value;}
這是默認(rèn)的構(gòu)造函數(shù),它將一個(gè)空串的字符數(shù)組引用賦給了本類的數(shù)組數(shù)組引用,所以這個(gè)String對(duì)象中什么也沒有當(dāng)然這樣做并沒有什么好處,因?yàn)镾tring對(duì)象一但創(chuàng)建便不可更改其內(nèi)容(從value的修飾關(guān)鍵字final可以看出)。
public String(String original){this.value=original.value;this.hash=original.value;}
這里只是簡(jiǎn)單的復(fù)制了引用的值,并沒有復(fù)制引用的內(nèi)容,它們?nèi)匀恢赶蛲粋€(gè)對(duì)象。
public String(char value[]){this.value=Arrays.copyOf(value,value.length);}
Array.copyOf()會(huì)將value中的值重新拷貝一份出來,所以this.value和參數(shù)中的value完全是兩個(gè)對(duì)象,只不過它們的值相同而已
其余的構(gòu)造函數(shù)也基本類似,大家可自行分析
Java技術(shù)相關(guān)內(nèi)容
Java字符串類型:http://www.bjpowernode.com/tutorial_java_advance/629.html
以上就是長(zhǎng)沙達(dá)內(nèi)教育java培訓(xùn)機(jī)構(gòu)的小編針對(duì)“編程基礎(chǔ)認(rèn)知,Java字符型常量詳解”的內(nèi)容進(jìn)行的回答,希望對(duì)大家有所幫助,如有疑問,請(qǐng)?jiān)诰€咨詢,有專業(yè)老師隨時(shí)為你服務(wù)。