欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

java基礎(chǔ)之Integer與int類型輸出示例解析

 更新時(shí)間:2023年06月30日 14:19:54   作者:hello_world  
這篇文章主要為大家介紹了java基礎(chǔ)之Integer與int類型輸出示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

正文

說(shuō)說(shuō)下面代碼的輸出:

Integer a1 = 10, b1 = 128;
Integer a2 = 10, b2 = 128;
Integer a3 = new Integer(10);
Integer b3 = new Integer(128);
System.out.println(a1==a2);//true
System.out.println(a1==a3);//false
System.out.println(b1==b2);//false
System.out.println(b1==b3);//false

代碼詳解

Integer為引用對(duì)象,那么兩個(gè)Integer對(duì)象使用"=="比較的就是空間地址,如果a1==a2那就說(shuō)明a1與a2的空間地址是相同的,為什么會(huì)相同呢?b1與b2的空間地址又為什么不相同了呢?

實(shí)際上對(duì)于第一與第二行代碼,java在編譯期做了優(yōu)化,實(shí)際上執(zhí)行的代碼如下

Integer a1 = = Integer.valueOf(10);

那么為什么使用valueOf方法創(chuàng)建Integer對(duì)象時(shí)a1與a2的空間地址是相同的而b1與b2的空間地址又不同了呢?下圖為valueOf方法的源碼

從圖中可以看到對(duì)不同的值會(huì)采用不同的創(chuàng)建方式,這一切似乎都與IntegerCache這個(gè)對(duì)象有關(guān),cache為緩存的意思,不難猜出如果符合if中的條件則從緩存中獲取一個(gè)對(duì)象,不符合則會(huì)new一個(gè)對(duì)象.

進(jìn)入到類IntegerCache中

private static class IntegerCache {
//IntegerCache.low的值為-128,被final修飾表示必須賦值且賦值后便不可再次更改
    static final int low = -128;
    //high值雖也被final修飾但并未賦初值,意味著要在后面賦初值
    static final int high;
    //用來(lái)存儲(chǔ)緩存的Integer對(duì)象
    static final Integer cache[];
    static {
        int h = 127;
//從虛擬機(jī)配置中獲取配置"java.lang.Integer.IntegerCache.high"的值,可以自己修改虛擬機(jī)配置,默認(rèn)沒(méi)有該條配置
        String integerCacheHighPropValue =
       sun.misc.VM.getSavedProperty("java.lang.Integer.IntegerCache.high");
        if (integerCacheHighPropValue != null) {
            try {
//將獲取的String配置值轉(zhuǎn)為int
                int i = parseInt(integerCacheHighPropValue);
                i = Math.max(i, 127);
//配置的值若超過(guò)int類型能表示的最大值,肯定是不行的,同時(shí)也是因?yàn)榫彺娴膶?duì)象都是存在了數(shù)組中而數(shù)組的大小也是有上線的,超過(guò)數(shù)組最大上限就緩存不下了
                h = Math.min(i, Integer.MAX_VALUE - (-low) -1);
            } catch( NumberFormatException nfe) {
                // If the property cannot be parsed into an int, ignore it.
            }
        }
        high = h;
        cache = new Integer[(high - low) + 1];
        int j = low;
        for(int k = 0; k < cache.length; k++)
            cache[k] = new Integer(j++);
        assert IntegerCache.high >= 127;
    }
    private IntegerCache() {}
}

綜上可以看出在不修改虛擬機(jī)配置的情況下,Integer會(huì)在第一次調(diào)用valueOf方法時(shí)將-128與127的Integer對(duì)象進(jìn)行緩存.所有使用valueOf獲取的Integer對(duì)象若在范圍-128~127則都為緩存中的同一對(duì)象,而不在范圍內(nèi)的值則會(huì)重新new一個(gè)Integer對(duì)象.回過(guò)頭再看看開(kāi)始的代碼輸出,是否跟預(yù)想的結(jié)果一致了呢

比較Integer與Integer的大小

若想比較Integer與Integer的大小,使用equals比較即可

再來(lái)看看下面代碼的輸出

Integer a1 = new Integer(100); 
int a2 = 100;
Integer a3 = new Integer(100);
//當(dāng)一個(gè)基本類型和一個(gè)包裝類型比較時(shí),包裝類型會(huì)被自動(dòng)拆包進(jìn)行比較
System.out.println(a1 == a2);//true
//equals方法內(nèi)部調(diào)用了intValue方法,該方法會(huì)返回Integer對(duì)象中使用int修飾的value值,這個(gè)過(guò)程就是所謂的拆包
System.out.println(a1 == a3);//false
System.out.println(a1.equals(a3));//true

以上就是java基礎(chǔ)之Integer與int類型輸出示例解析的詳細(xì)內(nèi)容,更多關(guān)于java類型Integer int的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

最新評(píng)論