我的理解之基本型別與常量池
阿新 • • 發佈:2018-12-26
我的理解之基本型別與常量池
這裡只以int型別為例,其他的我還沒嘗試。
package com.yddata;
public class Test {
public static void main(String[] args) {
int a = 32767;
int b = 32768;
}
}
我們編譯該程式碼,然後使用javap來檢視虛擬機器位元組碼的指令獲得如下內容
javap -verbose Test
我們暫時只看這一塊
處理32767時,可以看到指令
sippush --將一個短整型常量值(-32768-32767)推送至棧頂
istore_1 --將棧頂int型數值存入第2個本地變數(0為第1個)
看一看到這裡並沒有去常量池裡取資料,而是直接從棧裡獲取資料。
處理32768的時候,我們看到用了ldc
ldc: 將int、float或者String型常量值從常量池中推送至棧頂
我用-32767和-32769頁進行了測試,結果和我預想的是一樣的。
所以,綜上所說,當int的值在 短整型常量值(-32768-32767)範圍內的時候,int值存放在棧中,若超過這個範圍,那麼就會放到常量池中。
那麼Integer呢? 是不是也是這樣的呢。
我們也可以試一下,結果如下:
package com.yddata; public class Test { public static void main(String[] args) { Integer c = 32767; Integer d = 32768; } }
package com.yddata;
public class Test {
public static void main(String[] args) {
Integer c = -32767;
Integer d = -32769;
}
}
結果也是一樣的啊。
有人會說,我在網上看到的Integer的型別說值在-128-127範圍內才回被放到常量池的。
我的理解是,這個常量池和上面說的常量池是不一樣的常量池。這裡的-128-127其實是Integer的自身的一個常量池。
我們看到Integer的valueOf方法中是這麼寫的
public static Integer valueOf(int i) {
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}
這裡low的職位-128 high為127,在這個範圍時,將他們放入了IntegerCache的cache陣列中,不在這個範圍,則重新new一個Integer物件。
所以這裡是用的Integer的本身的常量池。不是虛擬機器記憶體中說的常量池。
以上內容是我自己測試出來的結果,如果哪位大牛覺得不對,歡迎一起探討,共同進步!