自動パッキングとボクシングの問題は、Javaの一般的な問題です。今日は、梱包とボクシングの問題のいくつかを見ていきます。この記事では、最初に梱包とボクシングに関する最も基本的なことについて説明し、次に以下の筆記試験でしばしば遭遇する梱包と解凍に関連する問題を見てみましょう。
1。梱包とは何ですか?ボクシングの箱とは何ですか?
前の記事では、Javaは、基本データ型ごとに対応するラッパータイプを提供します。基本的なデータタイプごとにラッパータイプが提供される理由については、ここでは説明しません。興味のある友達は関連情報を参照できます。 Java SE5の前に、値が10の整数オブジェクトを生成する場合は、これを行う必要があります。
コードコピーは次のとおりです。
整数i = new Integer(10);
Java SE5以降、自動ボクシング機能が提供されます。値が10の整数オブジェクトを生成する場合は、これを行う必要があります。
コードコピーは次のとおりです。
整数i = 10;
このプロセスでは、対応する整数オブジェクトは、パッキングである数値値に基づいて自動的に作成されます。
では、箱の箱とは何ですか?名前が示すように、それはパッキングに対応し、ラッパータイプを自動的に基本データ型に変換します。
コードコピーは次のとおりです。
整数i = 10; //パッキング
int n = i; // box
簡単に言えば、梱包とは、基本的なデータ型をラッパー型に自動的に変換することを意味します。ボックス化は、ラッパータイプを自動的に基本データ型に変換することを意味します。
次の表は、基本的なデータ型に対応するラッパータイプです。
2。パッキングとアンボックス化はどのように実装されていますか?
前のセクションでの梱包の基本概念を理解した後、このセクションでは、梱包とアンボックスの実装方法を理解します。
Intergerクラスを例として取り上げて、以下のコードをご覧ください。
public class main {public static void main(string [] args){integer i = 10; int n = i;}}}クラスファイルを非難すると、次のコンテンツが取得されます。
再コンパイルによって取得されたバイトコードコンテンツから、整数のValueof(int)メソッドが梱包時に自動的に呼び出されることがわかります。ボクシングを解除すると、整数のintValueメソッドが自動的に呼び出されます。
他のものは、ダブルやキャラクターなど、似ています。それを信じていない友人は、自分で手動でそれを試すことができます。
したがって、パッキングとボクシングの実装プロセスは、1つの文で要約できます。
ボクシングプロセスは、ラッパーのValueofメソッドを呼び出すことによって実装され、アンボクシングプロセスはラッパーのxxxValueメソッドを呼び出すことによって実装されます。 (XXXは、対応する基本データ型を表します)。
3。インタビュー中の関連する質問
ほとんどの人は、梱包とボクシングの概念について明確ですが、インタビューや筆記試験中に梱包とボックス化について質問に答えることができない場合があります。以下は、パッキング/ボクシングに関連する一般的なインタビューの質問です。
1.次のコードの出力結果は何ですか?
public class main {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);}}}}}たぶん、一部の友人は、彼らが虚偽を出力すると言うでしょう、あるいは、一部の友人は彼らが真実を出力すると言うでしょう。しかし、実際には出力は次のとおりです。
真実
間違い
なぜそのような結果が発生するのですか?出力の結果は、I1とI2が同じオブジェクトを指し、I3とI4が異なるオブジェクトを指すことを示しています。この時点で、真実を知るためにソースコードを見るだけです。次のコードは、IntegerのValue of Methodの特定の実装です。
public static integer valueof(int i){if(i> = -128 && i <= integercache.high)return integercache.cache [i + 128]; elsereturn new Integer(i);} IntegerCacheクラスの実装は次のとおりです。
private static class integercache {static final int high; static final integerキャッシュ[]; static {final int low = -128; // high high high high high highは、propertyint h = 127; if(integercachehhighpropvalue!= null){// long.decodeを使用するためにinteger's cachingにinteger's cakeに依存することを避けます。 long.decode(integercachehhighpropvalue).intvalue(); i = math.max(i、127); //最大配列サイズはinteger.max_valueh = math.min(i、integer.max_value -low);} high = h; cacheg = k integer cache.length; k ++)cache [k] = new integer(j ++);} private integercache(){}}これら2つのコードから、値の値を介して整数オブジェクトを作成するとき、値が[-128、127]の間にある場合、integercache.cacheに既に存在するオブジェクトへの参照が返されます。それ以外の場合、新しい整数オブジェクトが作成されます。
上記のコードでは、i1とi2の値は100であるため、既存のオブジェクトはキャッシュから直接取得されるため、i1とi2は同じオブジェクトを指し、i3とi4はそれぞれ異なるオブジェクトを指します。
2。次のコードの出力結果は何ですか?
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);}}}}一部の友人は、出力の結果は上記の質問と同じだと思うかもしれませんが、実際にはそうではありません。実際の出力は次のとおりです。
間違い
間違い
特定の理由により、読者はダブルクラスの価値の実装を確認できます。
ここでは、ダブルクラスのValueの方法が、整数クラスのValue Of Methodとは異なる実装を採用する理由のみを説明します。それは非常に簡単です。特定の範囲の整数値の数は有限ですが、浮動小数点数はそうではありません。
整数、短い、バイト、文字、および長い方法の価値の実装は類似していることに注意してください。
DoubleとFloatのValueof Methodの実装は似ています。
3。次のコードの出力結果は何ですか。
public class main {public static void main(string [] args){boolean i1 = false; boolean i2 = false; boolean i3 = true; boolean i4 = true; system.out.println(i1 == i2); system.out.println(i3 == i4);}}}}}出力の結果は次のとおりです。
真実
真実
これが結果である理由については、ブールクラスのソースコードを読んだ後、一目で明確になります。以下は、BooleanのValue of Methodの具体的な実装です。
public static boolean valueof(boolean b){return(b?true:false);}そして、真実と偽は何ですか? 2静的なメンバープロパティは、ブールで定義されています。
public static final boolean true = new boolean(true);/** * <code> boolean </code>オブジェクトは、プリミティブ *値<コード> false </code>に対応しています。 */public static final boolean false = new boolean(false);
この時点で、上記の出力がなぜ当てはまるのか、誰もが理解する必要があります。
4。整数i = new Integer(xxx)とinteger i = xxxの違いについて話してください。
もちろん、このトピックは比較的広いタイプに属します。しかし、重要なポイントに答えなければなりません。次の2つの違いを要約しましょう。
1)最初の方法は、自動ボクシングプロセスをトリガーしません。 2番目のメソッドがトリガーされます。
2)実行効率とリソース利用の違い。実行効率とリソース使用の2番目の方法は、一般的に最初の方法よりも優れています(これは絶対ではないことに注意してください)。
5.次のプログラムの出力結果は何ですか?
public class main {public static void main(string [] args){integer a = 1; integer b = 2; integer c = 3; integer d = 3; integer e = 321; integer f = 321; long g = 3l; long h = h = 3l; 2L;System.out.println(c==d);System.out.println(e==f);System.out.println(c==(a+b));System.out.println(c.equals(a+b));System.out.println(g==(a+b));System.out.println(g.equals(a+h));}}最初に出力の結果を見ないでください。読者は、このコードの出力結果を自分で考えます。ここで注意すべきは、「==」オペレーターの2つのオペランドがラッパー型への参照である場合、ポインターが同じオブジェクトであるかどうかを比較し、オペランドの1つが式(つまり、算術操作が含まれる)である場合、数値値を比較します(自動化されていないアンボックスプロセスをトリガーします)。さらに、ラッパータイプの場合、Equalsメソッドはタイプ変換を実行しません。これらの2つのポイントを理解した後、上記の出力の結果は一目で明らかになります。
真実
間違い
真実
真実
真実
間違い
真実
最初と2番目の出力の結果については疑いの余地はありません。 3番目の文では、A+Bには算術操作が含まれているため、自動アンボックスプロセス(intValueメソッドが呼び出されます)がトリガーされるため、値が等しいかどうかを比較します。 C.Equals(A+B)の場合、自動解除プロセスが最初にトリガーされ、次に自動パッキングプロセスがトリガーされます。つまり、A+BはそれぞれintValueメソッドを呼び出し、追加操作後に値を取得した後、integer.valueofメソッドが呼び出され、等しい比較が実行されます。同じことが以下にも当てはまりますが、最後の2番目の結果と最後の出力の結果に注意してください(値がintのタイプの場合、ボクシングプロセスはinteger.valueofを呼び出します。タイプが長い場合、ボクシングメソッドはlong.valueofを呼び出します)。
上記は、編集者があなたに紹介したJavaの梱包と解凍についての深い理解です。それがあなたに役立つことを願っています。ご質問がある場合は、メッセージを残してください。編集者は時間内に返信します。 wulin.comのウェブサイトへのご支援ありがとうございます!