ホームページ  >  記事  >  Java  >  Java での自動アンボックス化の簡単な紹介

Java での自動アンボックス化の簡単な紹介

黄舟
黄舟オリジナル
2017-10-12 10:15:221178ブラウズ

この記事は主に Java 自動アンボックスに関する関連情報を詳しく紹介します。興味のある方は参考にしてください。

面接の過程で、面接官はよく基本的な質問をします。 . この問題は実際には難しくありませんが、独学するときに注意しないと混乱する可能性があるため、この問題について著者がいくつかまとめて一緒に宣伝します!

1. アンボックス化の概念

いわゆるアンボックス化とは、JDK1.5以降のJavaの基本型と参照型の相互変換を指します。

1.1 アンボックス化

アンボックス化とは、基本データ型の頭文字を大文字にしたLong、Integer、Double、Float などの対応する参照型を基本データ型に変換する行為のことをアンボックス化といいます。

1.2 ボックス化

ボックス化とは、byte、int、short、long、double、float、boolean、char を意味します。これらの Java の基本データ型は、データ型を定義するときに、対応する参照型として宣言されず、コンパイラー内で自動的に変換されます。処理中の参照型への変換はボックス化と呼ばれます。

2. アンボックス化の関連応用

JDK1.5以降、基本型と参照型を変換する際に便利です:


package com.hzp.CZX;
/**
 * 测试拆装箱
 * @author 夜孤寒
 * @version 1.1.1
 */
public class TestDemo {
  /**
   * 拆装箱JDK1.5后
   */
  public static void first(){
    Integer i=7;//基本类型-->引用类型
    int j=i;//引用类型-->基本类型
    System.out.println(j);
  }
  /**
   * 拆装箱JDK1.4
   */
  public static void second(){
    Integer i=new Integer(78);
    int j=i.intValue();
    System.out.println(j);
  }
  /**
   * 测试方法
   * @param args
   */
  public static void main(String[] args) {
    first();
    second();
  }
}

以上がアンボックス化の紹介です 基本的なポイントと使用方法がいくつかあります, しかし、分解ボックスを使用する際には注意しなければならない点がいくつかありますので、それらの点を以下にまとめます。

3. 注意事項

まず、次のようなコードを投稿します:


package com.ygh.CZX;
/**
 * 关于java的拆装箱范围剖析
 * @author 夜孤寒
 * @version 1.1.1
 */
public class Test {
  /**
   * 以Integer类型为例
   */
  public static void first(){
    Integer i=new Integer(124);
    Integer j=new Integer(124);
    System.out.println(i==j);//false
    Integer a1=-128;
    Integer a2=-128;
    System.out.println(a1==a2);//true
    Integer b1=-129;
    Integer b2=-129;
    System.out.println(b1==b2);//false
    Integer c1=127;
    Integer c2=127;
    System.out.println(c1==c2);//true
    Integer d1=128;
    Integer d2=128;
    System.out.println(d1==d2);//false
  }
  public static void main(String[] args) {
    first();
    
  }
}

簡単な説明:

最初の結果が false である理由は、異なるオブジェクトが作成されるためです。違います ;

しかし、2 番目と 3 番目の結果が異なるのはなぜですか?

この問題をソースコードの観点から分析するために、Integer クラスのソース コードを以下に掲載します。


  /**
   * Returns an {@code Integer} instance representing the specified
   * {@code int} value. If a new {@code Integer} instance is not
   * required, this method should generally be used in preference to
   * the constructor {@link #Integer(int)}, as this method is likely
   * to yield significantly better space and time performance by
   * caching frequently requested values.
   *
   * This method will always cache values in the range -128 to 127,
   * inclusive, and may cache other values outside of this range.
   *
   * @param i an {@code int} value.
   * @return an {@code Integer} instance representing {@code i}.
   * @since 1.5
   */
  public static Integer valueOf(int i) {
    if (i >= IntegerCache.low && i <= IntegerCache.high)
      return IntegerCache.cache[i + (-IntegerCache.low)];
    return new Integer(i);
  }

上記のコードは、ボックスを自動的に展開し、それを超えると範囲があることを意味します。この範囲を指定した場合、同じオブジェクトを指すのではなく、新しく作成されたオブジェクトを返します。この範囲は、Integer クラスの内部プライベート クラスである IntegerCache に反映できます。ソース コードは次のとおりです。ここから Out がわかり、範囲値は [-128,127] の間です。

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

概要: 自動アンボックス化のこれらの基本型の範囲は次のとおりです:

1. ブール型の値

2. すべてのバイト値

3. -128~127 の Short 型の値

4. -128~127のint型の値

5. u0000~u00ffのchar型の値

そして、doubleとfloatは異なります。doubleを例として使用し、コードの説明を投稿します。

 private static class IntegerCache {
    static final int low = -128;
    static final int high;
    static final Integer cache[];

    static {
      // high value may be configured by property
      int h = 127;
      String integerCacheHighPropValue =
        sun.misc.VM.getSavedProperty("java.lang.Integer.IntegerCache.high");
      if (integerCacheHighPropValue != null) {
        try {
          int i = parseInt(integerCacheHighPropValue);
          i = Math.max(i, 127);
          // Maximum array size is Integer.MAX_VALUE
          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++);

      // range [-128, 127] must be interned (JLS7 5.1.7)
      assert IntegerCache.high >= 127;
    }

    private IntegerCache() {}
  }

上記のコードの出力結果がすべて false であることに注目してください。同様に、Double クラスの valueOf メソッドを使用して議論します。ソース コードを投稿すると、次のことが明確になります。つまり、double の値の範囲に関係なく、返されるということです。あなたにとって新しいオブジェクトです。 float は double と同じなので、詳細は説明しません。

上記は開梱ボックスの作者によるアレンジです。読者の方が異なる意見を持っている場合は、コメント欄に提出していただければ、作者が修正します。

以上がJava での自動アンボックス化の簡単な紹介の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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