更新時間:2020-06-18 14:23:50 來源:動力節點 瀏覽2252次
在Java程序中經常會遇到類似于"Hello"這樣地字符串,那么這種類型的字符串是Java中是如何存儲,下面就來討論一下字符串常量在內存中的存儲方式
Java程序在編譯時會將程序中出現的常量(包括:char、byte、short、int、long、boolean和String類型)放到一個叫做常量池的地方。常量池也稱為對象池,顧名思義常量池中存儲的是對象。
那么在源程序中檢測到"Hello"這樣地常量字符串之后,編譯器都干了些什么:
首先,在常量池中創建一個String對象,該對象的內存分布如下圖:
這里就需要提一下String定義的兩個變量:
private final char value[];//The value is used for character storage
private int hash;//Cache the hash code for the string
其中第一個就是實際存儲字符串的數組,所有字符串最終的存儲形式都是字符數組。從上圖中可以很清晰的看出,實際的字符數組還是存儲在堆中,常量池中存儲的是String對象。
當執行String str="Hello",只是將常量池中"Hello"對象的地址賦給了str。
除了上面這個字符串常量的內存模型需要理清之外,String類還有幾個很常用的構造函數,也需要對內存模型非常熟悉:
public String(){
this.value="".value;
}
這是默認的構造函數,它將一個空串的字符數組引用賦給了本類的數組數組引用,所以這個String對象中什么也沒有當然這樣做并沒有什么好處,因為String對象一但創建便不可更改其內容(從value的修飾關鍵字final可以看出)。
public String(String original){
this.value=original.value;
this.hash=original.value;
}
這里只是簡單的復制了引用的值,并沒有復制引用的內容,它們仍然指向同一個對象。
public String(char value[]){
this.value=Arrays.copyOf(value,value.length);
}
Array.copyOf()會將value中的值重新拷貝一份出來,所以this.value和參數中的value完全是兩個對象,只不過它們的值相同而已
其余的構造函數也基本類似,大家可自行分析
Java技術相關內容
Java字符串類型:http://www.dabaquan.cn/tutorial_java_advance/629.html
以上就是動力節點java培訓機構的小編針對“編程基礎認知,Java字符型常量詳解”的內容進行的回答,希望對大家有所幫助,如有疑問,請在線咨詢,有專業老師隨時為你服務。
0基礎 0學費 15天面授
有基礎 直達就業
業余時間 高薪轉行
工作1~3年,加薪神器
工作3~5年,晉升架構
提交申請后,顧問老師會電話與您溝通安排學習