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 での自動ボックス化とボックス化解除についての深い理解の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。