標籤:char 類型 定義 short str 記憶體 地方 字串 log
在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類還有幾個很常用的建構函式,也需要對記憶體模型非常熟悉:
1. public String() {
this.value = "".value;
}
這是預設的建構函式,它將一個空串的字元數組引用賦給了本類的數組數組引用,所以這個String對象中什麼也沒有當然這樣做並沒有什麼好處,因為String對象一但建立便不可更改其內容(從value的修飾關鍵字final可以看出)。
2. public String(String original) {
this.value = original.value;
this.hash = original.value;
}
這裡只是簡單的複製了引用的值,並沒有複製引用的內容,它們仍然指向同一個對象。
3. public String(char value[]) {
this.value = Arrays.copyOf(value, value.length);
}。
Array.copyOf()會將value中的值重新拷貝一份出來,所以this.value和參數中的value完全是兩個對象,只不過它們的值相同而已
其餘的建構函式也基本類似,大家可自行分析
Java字元常量詳解