1. 程式人生 > >我的理解之基本型別與常量池

我的理解之基本型別與常量池

我的理解之基本型別與常量池

這裡只以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的本身的常量池。不是虛擬機器記憶體中說的常量池。

以上內容是我自己測試出來的結果,如果哪位大牛覺得不對,歡迎一起探討,共同進步!