ホームページ >Java >&#&はじめる >Java での自動ボックス化とボックス化解除についての深い理解

Java での自動ボックス化とボックス化解除についての深い理解

王林
王林転載
2019-12-19 11:55:292934ブラウズ

Java での自動ボックス化とボックス化解除についての深い理解

1. ボ​​ックス化とアンボックス化とは

ボックス化: 基本的なデータ型をパッケージ化クラスに変換します。

アンボックス化: ラッパー クラスを基本データ型に変換します。

基本データ型に対応するパッケージング クラス:

int (数バイト 4) - 整数

byte (1) - Byte

short (2) - Short

long (8) - Long

float (4) - Float

double (8) - Double

char (2) ) - Character

boolean (未定義) - Boolean

無料のオンライン ビデオ学習チュートリアルの推奨事項: java ビデオ チュートリアル

2. まずはやってみましょう手動ボックス化と手動アンボックス化を見てください

例: int と Integer を例として取り上げます

Integer i1=Integer.valueOf(3);
int i2=i1.intValue();

手動ボックス化は valueOf を通じて行われます。= が On に正しい値を割り当てることは誰もが知っています。左の 3 は int 型で、左に代入すると整数ラッパー クラスになります。

手動のボックス化解除は intValue() を通じて行われます。コードを通して、i1 が Integer から int に変化することがわかります

3。手動で読み取った後、自動# を見てみましょう。

##技術担当者の作業を容易にするために、Java は jdk1.5 から自動ボックス化およびボックス化解除に変更されました。上記の例を見てみましょう:

Manual:

Integer i1=Integer.valueOf(3);
int i2=i1.intValue();

自動

Integer i1=3;
int i2=i1;

これはデフォルトで自動的にインストールおよび逆アセンブルされます。

4. いくつかの質問から自動ボックス化とボックス化解除について理解を深めます

(1)

Integer a = 100;
int b = 100;
System.out.println(a==b);结果为 true

理由: a は自動的にボックス化とボックス化解除を行い、以下と比較します。 b、それは true です。

(2)

Integer a = 100;
Integer b = 100;
System.out.println(a==b);//结果为true
Integer a = 200;
Integer b = 200;
System.out.println(a==b);//结果为false

興味深いことが起こりました。なぜ 2 つの変数は同じで、値が異なる方だけが true で、もう 1 つは false なのです。

理由: この場合、比較記号 == について説明する必要があります。 == 比較のメモリ アドレスは、new から出てくるオブジェクトのメモリ アドレスです。これを見たとき、ああ、でも実際には Integer a=200; デフォルトでは 200 の前に new Integer があり、使用されるメモリ アドレスが異なります == 比較は false ですが、なぜ 100 が true なのでしょうか?これは Java の定数プールによるもので、Integer のソース コードをクリックして確認できます。

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

-128 と 127 を比較する場合、新しいオブジェクトは新しいものではなく、定数プールから直接取得されるため、100 が true となり、200 がこの範囲を超えると、新しい操作が実行されます。なので、メモリアドレスが異なります。

(3)

Integer a = new Integer(100);
Integer b = 100;
System.out.println(a==b);
//结果为false

これは上記の 100 と似ています。定数プールから取得します。なぜ false なのでしょうか?

理由: new Integer(100) の理由。100 は定数プールから取得できますが、new にオブジェクトを直接与えることはできません。使用される 2 つのメモリ アドレスが異なります。

(4)

Integer a = 100;
Integer b= 100;
System.out.println(a == b);
//结果true
a = 200;
b = 200;
System.out.println(c == d);
//结果为false

理由: = 記号の右側の値は左側の a に割り当てられており、b はすでにパッケージング クラスであり、200 は定数プールにありません。 int 型 200 をパッケージング クラスに自動的に割り当てます。ボックス化は定数プールにないため、オブジェクトはデフォルトで新しいため、結果は false になります。

その他の関連記事やチュートリアルについては、次のリンクを参照してください:

Java 言語の概要

以上がJava での自動ボックス化とボックス化解除についての深い理解の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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