ホームページ >Java >&#&チュートリアル >Java のアンボックス化の詳細な分析

Java のアンボックス化の詳細な分析

高洛峰
高洛峰オリジナル
2017-01-24 13:57:281183ブラウズ

まずコードの一部を見てみましょう:

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);
  }
}


結果はどうなるかわかりますか?

多くの人は結果が全て正しいと思うでしょうが、結果はこんなものではありません

tru​​e
false

なぜこの結果になるのでしょうか?結果をメモリの観点から説明すると、num1 と num2 は同じオブジェクトを指しますが、num3 と num4 は異なるオブジェクトを指します。次に、その理由を説明します。Integer 型の valueof メソッドのソース コードを見てみましょう:

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 の実装:


これらからわかるように、 valueof メソッドが Integer 型オブジェクトを作成する場合、値の範囲は [-128,127] です。この範囲内では、値がこの範囲を超えると、ポインタは IntegerCache.cache 内の既存のオブジェクト参照を指します。オブジェクトが作成されます。

注意すべき点は、すべての型がこの範囲内にあるわけではないということです。Double 型を見てください:

最終的な出力結果:


false

false

この結果の具体的な理由は次のとおりです。ソース コード内の Double valueof メソッドの実装を見てください。これは、特定の範囲内の整数値の数が制限されているが、浮動小数点数には制限がないため、Integer valueof メソッドとは異なります。


Integer、Short、Byte、Character、および Long クラスの valueOf メソッドの実装は似ていることに注意してください。

Double と Float の valueOf メソッドの実装は似ています。

1 つプルダウンすると、ブール型の結果は 2 つの True または False になります。ソースコードを直接見てください:

&#39;&#39;&#39;// IntegerCache,一个内部类,注意它的属性都是定义为static final&#39;&#39;&#39;
  private static class IntegerCache {
    static final int high; &#39;&#39;&#39;//缓存上界,暂为null&#39;&#39;&#39;
    static final Integer cache[]; &#39;&#39;&#39;//缓存的整型数组&#39;&#39;&#39;
 
    &#39;&#39;&#39;// 块,为什么定义为块&#39;&#39;&#39;
    static {
      final int low = -128; &#39;&#39;&#39;// 缓存下界,不可变了。只有上界可以改变&#39;&#39;&#39;
 
      &#39;&#39;&#39;// high value may be configured by property&#39;&#39;&#39;
      &#39;&#39;&#39;// h值,可以通过设置jdk的AutoBoxCacheMax参数调整(以下有解释),自动缓存区间设置为[-128,N]。注意区间的下界是固定&#39;&#39;&#39;
      int h = 127;
 
      if (integerCacheHighPropValue != null) {
        &#39;&#39;&#39;// Use Long.decode here to avoid invoking methods that&#39;&#39;&#39;
        &#39;&#39;&#39;// require Integer&#39;s autoboxing cache to be initialized&#39;&#39;&#39;
        // 通过解码integerCacheHighPropValue,而得到一个候选的上界值&#39;&#39;&#39;
        int i = Long.decode(integerCacheHighPropValue).intValue();
        &#39;&#39;&#39;// 取较大的作为上界,但又不能大于Integer的边界MAX_VALUE&#39;&#39;&#39;
        i = Math.max(i, 127);  
        &#39;&#39;&#39;// Maximum array size is Integer.MAX_VALUE&#39;&#39;&#39;
        h = Math.min(i, Integer.MAX_VALUE - -low);
      }
      high = h; &#39;&#39;&#39;//上界确定&#39;&#39;&#39;
      &#39;&#39;&#39;// 就可以创建缓存块,注意缓存数组大小&#39;&#39;&#39;
      cache = new Integer[(high - low) + 1]; //
      int j = low;
      for(int k = 0; k < cache.length; k++)
        cache[k] = new Integer(j++); &#39;&#39;&#39;// -128到high值逐一分配到缓存数组&#39;&#39;&#39;
    }
 
    private IntegerCache() {}
  }

そして、TRUEとFALSEは次のように定義されています:

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);
  }
}

上記がこの記事の全内容です。皆様のお役に立てれば幸いです。 PHP中国語ウェブサイトをサポートしてください。


Java のアンボックス化の詳細な分析に関連するその他の記事については、PHP 中国語 Web サイトに注目してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。