一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - Java拆裝箱深度剖析

Java拆裝箱深度剖析

2020-07-20 13:32令仔很忙 Java教程

這篇文章主要為大家深度剖析了Java拆箱裝箱的相關資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下

先來看一段代碼:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
public class Main{
  public static void main(String[] args){
 
    Integer num1 = 100;
    Integer num2 = 100;
    Integer num3 = 200;
    Integer num4 = 200;
 
    '''//輸出結果'''
    System.out.println(num1==num2);
    System.out.println(num3==num4);
  }
}

猜猜結果是什么?

很多人都會認為結果全為true,但結果去不是這樣的

true
false

為什么是這樣的結果?如果用內存來解釋結果的話,num1和num2指向的是同一個對象,而num3和num4則指向的確是不同的對象。接下來就告訴你為什么,看一看Integer類型的valueof方法的源碼:

?
1
2
3
4
5
6
public static Integer valueOf(int i) {
  assert IntegerCache.high >= 127;
  if (i >= IntegerCache.low && i <= IntegerCache.high)
    return IntegerCache.cache[i + 128];
  return new Integer(i);
  }

其中IntegerCache的實現:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
'''// IntegerCache,一個內部類,注意它的屬性都是定義為static final'''
  private static class IntegerCache {
    static final int high; '''//緩存上界,暫為null'''
    static final Integer cache[]; '''//緩存的整型數組'''
 
    '''// 塊,為什么定義為塊'''
    static {
      final int low = -128; '''// 緩存下界,不可變了。只有上界可以改變'''
 
      '''// high value may be configured by property'''
      '''// h值,可以通過設置jdk的AutoBoxCacheMax參數調整(以下有解釋),自動緩存區間設置為[-128,N]。注意區間的下界是固定'''
      int h = 127;
 
      if (integerCacheHighPropValue != null) {
        '''// Use Long.decode here to avoid invoking methods that'''
        '''// require Integer's autoboxing cache to be initialized'''
        // 通過解碼integerCacheHighPropValue,而得到一個候選的上界值'''
        int i = Long.decode(integerCacheHighPropValue).intValue();
        '''// 取較大的作為上界,但又不能大于Integer的邊界MAX_VALUE'''
        i = Math.max(i, 127);  
        '''// Maximum array size is Integer.MAX_VALUE'''
        h = Math.min(i, Integer.MAX_VALUE - -low);
      }
      high = h; '''//上界確定'''
      '''// 就可以創建緩存塊,注意緩存數組大小'''
      cache = new Integer[(high - low) + 1]; //
      int j = low;
      for(int k = 0; k < cache.length; k++)
        cache[k] = new Integer(j++); '''// -128到high值逐一分配到緩存數組'''
    }
 
    private IntegerCache() {}
  }

通過這兩段代碼可以看出,在通過valueof方法創建Integer類型對象時,取值范圍為[-128,127],數值在這個區間里,指針指向IntegerCache.cache中已經存在的對象引用,當數值超出這個范圍,就會創建一個新的對象。

有一點需要注意的是,并不是所有的類型都是這個范圍,看Double類型:

?
1
2
3
4
5
6
7
8
9
10
11
12
public class Main{
  public static void main(String[] args){
 
    Double i1 = 100.0;
    Double i2 = 100.0;
    Double i3 = 200.0;
    Double i4 = 200.0;
 
    System.out.println(i1==i2);
    System.out.println(i3==i4);
  }
}

最終的輸出結果:

false
false

具體為什么回事這樣的結果,大伙可以去看看源代碼中Double valueof方法的實現,其和Integer valueof方法不同,是因為在某個范圍內的整型數值的個數是有限的,而浮點數卻不是。

注意,Integer、Short、Byte、Character、Long這幾個類的valueOf方法的實現是類似的。
Double、Float的valueOf方法的實現是類似的。

拉下了一個,Boolean類型的結果有兩個True or False。直接看源代碼:

?
1
2
3
public static Boolean valueOf(boolean b) {
    return (b ? TRUE : FALSE);
  }

而其中的TRUE和FALSE是這樣定義的:

?
1
2
3
4
5
6
7
public static final Boolean TRUE = new Boolean(true);
 
'''/** '''
'''* The <code>Boolean</code> object corresponding to the primitive '''
'''* value <code>false</code>. '''
'''*/'''
public static final Boolean FALSE = new Boolean(false);

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持服務器之家。

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 国产在线拍 | 蜜桃视频在线观看官网 | 国产精品va在线观看不 | 69成人网| 国产一级片视频 | 包射屋| 男女姓交大视频免费观看 | 精品久久久久久综合网 | 久久久久夜| 国产精品欧美亚洲韩国日本99 | 免费网站看v片在线香蕉 | 男人狂躁女人下面的视频免费 | 私人影院免费观看 | 色久久一个亚洲综合网 | www.91麻豆 | 欧美性4khd720 | 猛男深夜狂cao小男生 | 91精品国产91久久久久久 | 好男人社区www影院在线观看 | 日本中文字幕在线精品 | 天堂色| 国产精品久久久久久久久久久搜索 | 人禽l交免费视频观看+视频 | 亚洲成人一区在线 | 91午夜剧场 | japan孕妇孕交freehd| 亚洲高清在线视频 | 国产自拍偷拍自拍 | 成年人福利 | 秒播影视 午夜福利毛片 | 欧美日韩中文字幕一区二区高清 | 色综合网天天综合色中文男男 | 亚洲高清一区二区三区四区 | 高清国产欧美一v精品 | 好大好深好舒服 | 亚洲色导航 | 精品国产品香蕉在线观看75 | 欧美色图日韩 | 国产精品每日在线观看男人的天堂 | 成人综合久久综合 | 免费观看一级一片 |