Javaステップアップ(三十七)java自動梱包と解体
Javaステップアップ(三十七)java自動梱包と解体
前言
これはjdk 1.5以降に導入された新しい内容です.JAva言語規範では、多くの場合、包装と解包装はコンパイラによって自分で完成される(この場合、包装は箱詰めと呼ばれ、解包装は解包装と呼ばれている).
実は私自身の理解によって自動梱包は簡単に基本データ型をオブジェクトタイプにカプセル化してjavaのオブジェクト向けに適合するように理解することができます.たとえばintを例に挙げます.
//Integerオブジェクトの宣言
Integer num = 10;
//以上の声明は自動梱包を用いたものである:
Integer num = new Integer(10);
以上が良い体現です.10は基本的なデータ型に属しているので、原則として1つのオブジェクトIntegerに直接割り当てることはできませんが、jdk 1.5後にこのような声明を行うことができます.これが自動梱包の魅力です.
基本データ型を対応するパッケージ型に自動的に変換します.オブジェクトになると、オブジェクトが宣言したすべてのメソッドを呼び出すことができます.
自動分解:そのため、オブジェクトを基本データ型に再変換することが考えられます.
//箱詰め
Integer num = 10;
//箱を取り外す
int num1 = num;
自動分解には、オブジェクトが直接演算できないため、基本データ型に変換してから加算減算するのが一般的な使い方があります.
Integer num = 10;
//計算を行うときに隠しているのは自動分解箱です
System.out.print(num--);
次の例を見て、次の例を見て、==とequalの違いがはっきりしない場合は、まずここをクリックしてください.
印刷結果:num 1=num 2:false num3==num4: true
おかしいでしょう:これはjavaのIntegerとintに対する自動梱包と解体の設計に帰結して、1種のモードです:享元モード(flyweight)
簡単な数字の再利用を増やすためにjava定義:自動梱包時に–128から127までの値に対してIntegerオブジェクトとして梱包された後、メモリに再利用され、常に1つのオブジェクトしか存在しません.
一方、–128から127までの値を超えると、箱詰めされたIntegerオブジェクトは再利用されません.すなわち、箱詰めのたびに新しいIntegerオブジェクトが作成されることに相当します.分かったでしょう.
以上の現象は自動梱包を使用したことによるもので、自動梱包を使用していないのではなく、一般クラスと同じようにnewでインスタンス化すると、newのたびに新しいオブジェクトが作成されます.
このような自動梱包解体は、基本データ型だけでなく、Stringクラスにも適用されます.たとえば、Stringオブジェクトを頻繁に宣言する場合:
美文美図
前言
これはjdk 1.5以降に導入された新しい内容です.JAva言語規範では、多くの場合、包装と解包装はコンパイラによって自分で完成される(この場合、包装は箱詰めと呼ばれ、解包装は解包装と呼ばれている).
実は私自身の理解によって自動梱包は簡単に基本データ型をオブジェクトタイプにカプセル化してjavaのオブジェクト向けに適合するように理解することができます.たとえばintを例に挙げます.
//Integerオブジェクトの宣言
Integer num = 10;
//以上の声明は自動梱包を用いたものである:
Integer num = new Integer(10);
以上が良い体現です.10は基本的なデータ型に属しているので、原則として1つのオブジェクトIntegerに直接割り当てることはできませんが、jdk 1.5後にこのような声明を行うことができます.これが自動梱包の魅力です.
基本データ型を対応するパッケージ型に自動的に変換します.オブジェクトになると、オブジェクトが宣言したすべてのメソッドを呼び出すことができます.
自動分解:そのため、オブジェクトを基本データ型に再変換することが考えられます.
//箱詰め
Integer num = 10;
//箱を取り外す
int num1 = num;
自動分解には、オブジェクトが直接演算できないため、基本データ型に変換してから加算減算するのが一般的な使い方があります.
Integer num = 10;
//計算を行うときに隠しているのは自動分解箱です
System.out.print(num--);
次の例を見て、次の例を見て、==とequalの違いがはっきりしない場合は、まずここをクリックしてください.
// -128~127
Integer num1 = 297; Integer num2 = 297;
System.out.println("num1==num2: "+(num1==num2));
// -128~127
Integer num3 = 97; Integer num4 = 97;
System.out.println("num3==num4: "+(num3==num4));
印刷結果:num 1=num 2:false num3==num4: true
おかしいでしょう:これはjavaのIntegerとintに対する自動梱包と解体の設計に帰結して、1種のモードです:享元モード(flyweight)
簡単な数字の再利用を増やすためにjava定義:自動梱包時に–128から127までの値に対してIntegerオブジェクトとして梱包された後、メモリに再利用され、常に1つのオブジェクトしか存在しません.
一方、–128から127までの値を超えると、箱詰めされたIntegerオブジェクトは再利用されません.すなわち、箱詰めのたびに新しいIntegerオブジェクトが作成されることに相当します.分かったでしょう.
以上の現象は自動梱包を使用したことによるもので、自動梱包を使用していないのではなく、一般クラスと同じようにnewでインスタンス化すると、newのたびに新しいオブジェクトが作成されます.
このような自動梱包解体は、基本データ型だけでなく、Stringクラスにも適用されます.たとえば、Stringオブジェクトを頻繁に宣言する場合:
String str = "sl";
//
String str = new String("sl");
美文美図