Javeのautbox ingとautunbox ing

3154 ワード

Java自動箱詰めと抜箱
一:自動箱とは何ですか?
基本データタイプの自動箱詰め(atobox ing)、箱出し(unbox ing)はJ 2 SE 5.0から提供される機能です。
一般的に私たちがクラスのオブジェクトを作成する時、私たちはこうなります。
Class a = new Class(parameter);

         Integer   ,     :

 Integer i = 100; (  :   int i = 100; )

   ,           ,        :
Integer i = new Integer(100); 
               。
基本データタイプとオブジェクトの違い
基本データタイプは対象ではなく、int、double、bollanなどで定義される変数、定数を使用します。
基本データタイプには呼び出し可能な方法がありません。
eg: int t = 1;      t.          。

 Integer t =1; t.                。
いつ自動で箱に入れますか?
 
   :Integer i = 100;

                       :Integer i = new Integer(100);
四:いつ自動的に箱を開けますか?
自動取外し(unboxing)とは、対象の基本データを対象から自動的に取り出すことです。次のように自動的に箱を開けることができます。

Integer i = 10;        //  
int t = i;             //  
      ,            。 

Integer i = 10;
System.out.println(i++);

Integer     
// -128~127      
Integer i1 = 200;   
Integer i2 = 200; 
System.out.println("i1==i2: "+(i1==i2));
//  -128~127     
Integer i3 = 100;
Integer i4 = 100;
System.out.println("i3==i4: "+(i3==i4));
      :
i1==i2: false    i3==i4: true
説明:equals()は2つのオブジェクトの値(内容)が同じかどうかを比較します。「=」は、2つのオブジェクトの参照(メモリアドレス)が同じかどうかを比較し、2つの基本データタイプの変数値が等しいかを比較するためにも使用されます。自動箱詰め時には、–128から127までの間のBytteに対して、Integer、Long値をBytte、Integer、Longオブジェクトとして箱詰めした後、メモリにキャッシュされ、再利用されます。–128から127までの値を超えたら、箱詰めされたByte、IntegerはオブジェクトLongに再使用されません。つまり、1回に1つのByteを新たに(new)することに相当します。IntegerまたはLongオブジェクト(だから、例ではi 1とi 2は異なる対象です。)Charcterはタイプの特殊性のために、キャッシュされているのは0-127間のオブジェクトです。Booleanタイプでは、2つのBooleanオブジェクトを直接キャッシュし、TRUEとFALSEを使用すると、valueOf()方法を使用する場合は、この2つのオブジェクトのうちの1つに直接戻すだけで、呼び出しごとにnewを使用するのではなく、ドキュメントでいうキャッシュによって常に要求される値の2つは、空間と時間性能を著しく向上させる。
また、自動箱詰め機能を使用しない場合は、通常の対象と同じです。次の例を見てください。
Integer i3 = new Integer(100); 
Integer i4 = new Integer(100);
System.out.println("i3==i4: "+(i3==i4));//  false
 
Steringの箱詰め
まず例を見ます

String str1 = "abc";
String str2 = "abc";
System.out.println(str2==str1);  //    true 
System.out.println(str2.equals(str1));  //    true 
String str3 = new String("abc");
String str4 = new String("abc"); 
System.out.println(str3==str4);  //    false
System.out.println(str3.equals(str4));  //    true 
これはどう説明しますか?何も見えないようです。例を見てください。

String d ="2";
String e = "23";
e = e.substring(0, 1);
System.out.println(e.equals(d));       //    true
System.out.println(e==d);           //    false  
の第二の例では、eの初期値はdとは異なるので、eとdはそれぞれオブジェクトを作成し、e=dはfalseとなる。
同じ理屈から分かるように、第一例のstr 3とstr 4はそれぞれnewの対象であり、str 1とstr 2は同じ対象を引用している。
回転:
http://www.cnblogs.com/danne823/archive/2011/04/22/2025332.html