ホームページ  >  記事  >  Java  >  Java の自動ボックス化と自動アンボックス化とは何なのかについて簡単に説明します。

Java の自動ボックス化と自動アンボックス化とは何なのかについて簡単に説明します。

青灯夜游
青灯夜游転載
2018-10-19 17:43:022707ブラウズ

この記事の内容は、Java の自動ボックス化と自動アンボックス化とは何なのかについて簡単に説明することです。困っている友人は参考にしていただければ幸いです。

#自動アンボックス化と自動ボックス化#Java は、各基本データ型に対応するラッパー型を提供します。例:

public class TestMain
{
    public static void main(String[] args)
    {
        Integer i = 10;
    }
}

このプロセスでは、対応する Integer オブジェクトが値に基づいて自動的に作成されます。これが自動ボックス化

です。別のコードを見てください:

public class TestMain
{
    public static void main(String[] args)
    {
        Integer integer = 10;
        int i = integer;
    }
}
このプロセスでは、データは ラッパー タイプに従って基本タイプに自動的に変換されます。これは自動アンボックス化です。

自動ボックス化と自動アンボックス化の原理も非常に簡単です。コマンド ライン プログラムを使用して、CLASSPATH (つまり、bin ディレクトリ内の .class ファイルが配置されているパス) を入力し、javap で逆コンパイルして、生成されたバイトコードを確認します。

逆コンパイルされたコンテンツが大量にあります。重要なポイントのみに焦点を当てます。 パート:

public static void main(java.lang.String[]);
    flags: ACC_PUBLIC, ACC_STATIC
    Code:
      stack=1, locals=3, args_size=1
         0: iconst_1
         1: invokestatic  #16                 // Method java/lang/Integer.valueO
f:(I)Ljava/lang/Integer;
         4: astore_1
         5: aload_1
         6: invokevirtual #22                 // Method java/lang/Integer.intVal
ue:()I
         9: istore_2
        10: return

自動ボクシング中、

Java 仮想マシンが自動的に次の valueOf メソッドを呼び出すことを確認してください。 Integer; 自動アンボックス中 の場合、Java 仮想マシンは Integer の intValue メソッドを自動的に呼び出します。 これは、自動開梱と自動梱包の原理です。 null ポインター例外に注意してください

次のようなコードがあります:

public static void main(String[] args) throws Exception
{
    Object obj = getObj(null);
    int i = (Integer)obj;
}
    
public static Object getObj(Object obj)
{
    return obj;
}
この使用シナリオは非常に一般的です。セッションやリクエストの int 値を取り出すと上記と同様のシーンになります。したがって、自動アンボックス化中は null ポインター例外に注意してください。

小さなトラップ

2 つのコード部分を見てください。最初のコード部分は次のとおりです。

public class TestMain
{
    public static void main(String[] args)
    {
        Integer i1 = 100;
        Integer i2 = 100;
        Integer i3 = 200;
        Integer i4 = 200;
        
        System.out.println(i1 == i2);
        System.out.println(i3 == i4);
    }
}
実行結果は次のとおりです。
true
false
2 番目のコードは次のとおりです:

public class TestMain
{
    public static void main(String[] args)
    {
        Double d1 = 100.0;
        Double d2 = 100.0;
        Double d3 = 200.0;
        Double d4 = 200.0;
        
        System.out.println(d1 == d2);
        System.out.println(d3 == d4);
    }
}
実行結果は次のとおりです:

false
false
このような結果の理由は次のとおりです: Byte、Short、および Byte のボクシング クラスの valueOf() Integer、Long、Char メソッドは 128 ビットの分割線に基づいてキャッシュされます。値が 128 未満および -128 を超える場合は、Integer のソース コードが取得されます。 (int i) は次のとおりです。

public static Integer valueOf(int i) {
    final int offset = 128;
    if (i >= -128 && i <= 127) { // must cache 
        return IntegerCache.cache[i + offset];
    }
        return new Integer(i);
    }
Float と Double はそうではありません。理由は非常に単純です。byte、Short、integer、long、char の特定の範囲内の整数の数が制限されているためです。 float と double の 2 つの浮動小数点数は、いいえではありません。

要約: 以上がこの記事の全内容です。皆さんの学習に役立つことを願っています。関連チュートリアルの詳細については、

Java ビデオ チュートリアル

Java 開発グラフィック チュートリアル

ブートストラップ ビデオ チュートリアルをご覧ください。

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

声明:
この記事はcsdn.netで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。