JAvaハイテクの自動梱包解体
自動梱包解体はJDK 1.5の新しい特性であり、主な目的はパッケージクラスと基本タイプとの間の変換を容易にすることであり、この特性は基本データタイプ間の直接的な相互付与を可能にする.
次のコードを見てみましょう.
public class AutoBox {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Integer obj = 3;
System.out.println(obj+3);
Integer i1 = 12;
Integer i2 = 12;
Integer i3 =128;
Integer i4 =128;
System.out.println(i3==i4);
System.out.println(i1==i2);
}
}
入力結果:5
false
true
以下に説明するコードの中でobjはIntegerタイプで、1つの参照タイプで、objを3に割り当てる時、コンパイラは自動的に基本データ型intタイプの3をIntegerタイプに箱詰めして、それからobjに割り当てて、System.out.println(obj+3);文では、コンパイラはobjを基本データ型intタイプとして自動的にボックスを外し、3と加算します.
Integer i1 = 12;
Integer i2 = 12;
Integer i3 =128;
Integer i4 =128;
System.out.println(i3==i4);
System.out.println(i1==i2);}
これらのコードについては
基本タイプの整数について、Integerオブジェクトに箱詰めする場合、この数字が1バイト以内、すなわち-128~127の間にある場合、いったんIntegerオブジェクトにカプセル化されると、この値を1つのプールにキャッシュし、もう1つのオブジェクトを読み込むと、このプールにあるかどうかを見て、ある場合は直接アドレス値を新しく読み込んだオブジェクトに割り当てます.そうしないとnewの新しいオブジェクトは、このようにメモリスペースを節約すると、小さな整数が現れる頻度が高くなり、みんなが使うようになります.これを共有します.これはいわゆる享元モードです.つまり、オブジェクトが小さい場合、多くの場所でこのオブジェクトを使うので、このようなオブジェクトをたくさん作る必要がありますが、そんなに多くのオブジェクトを出すのは同じです.このとき、このようなオブジェクトを作ることができ、みんながこのオブジェクトを使ってメモリスペースを節約することができます.これは、Stringのメモリに保存するルールと似ています.