Jdk 5での梱包と解体


Javaでは、値タイプと参照タイプの2つの異なるデータ型があります.値タイプのデータはオブジェクトではないため、メモリとリソースが相対的に少ないが、オブジェクトとしてtoString()、hashCode()、getClass()、equals()などのメソッドを呼び出すことはできず、直接コレクションに追加することもできない.リファレンスタイプのデータは、メモリとリソースを多く消費するオブジェクトですが、本格的なオブジェクトとしてコレクションに直接入れることができます.
箱詰めとは、int型をIntegerクラスのオブジェクトに包装したり、doubleをDoubleに包装したりするなど、値タイプを対応する参照タイプで包んで、オブジェクトの特質を持つことができます.
解体とは,箱詰めの方向とは逆に,IntegerやDoubleのような参照タイプのオブジェクトを値タイプのデータに再簡略化することである.
J 2 SE 5.0がリリースされるまでは、梱包と解体しか手作業で処理できませんでしたが、コンパイラは自動的に必要な手順を完了することができます.次のコードは2つのバージョンの梱包と解体を提供します.1つのバージョンは手動で、もう1つのバージョンはこれらの明らかなコードをコンパイラに渡して完成します.
 
 public static void manualBoxingUnboxing(int i) ...{
  ArrayList<Integer> aList = new ArrayList<Integer>();
  aList.add(0, new Integer(i));
  int a = aList.get(0).intValue();
  System.out.println("The value of i is " + a);
 }
 public static void autoBoxingUnboxing(int i) ...{
  ArrayList<Integer> aList = new ArrayList<Integer>();
  aList.add(0, i);
  int a = aList.get(0);
  System.out.println("The value of i is " + a);
 }

J 2 SE 5.0では、値タイプのデータを対応するオブジェクトに明示的に変換する必要はありません.それによって、オブジェクトとして他の方法に渡す必要はありません.また、数値を表すオブジェクトを手動で対応する値タイプのデータに分解する必要はありません.もちろん、ここではいくつかの説明をしなければならない問題があります.値のタイプと参照のタイプについては、リソースの占有において明らかな違いがあります.この便利な特性を使用すると同時に、本質的な違いを簡単に忘れないでください.
 
ps:
次に例をあげて皆さんに
 
public class Test {
        public static void main(String args[]){
                Integer m = new Integer(5);
                Integer n = new Integer(5);
                System.out.println(m==n);
                m = m-1;
                n = n-1;
                System.out.println(m==n);
        }
}

 
出力結果false true
 
まずfalse、後true.
最初の比較:
2つの異なるオブジェクトアドレスを比較すると、明らかにfalseです.
2回目の比較:
JDK 5には自動解体と梱包の機能があります.
−1演算を行うと、m,nは自動解体を元のタイプとし、==アドレス比較ではなくコンテンツ比較とする.
内容は、4==4なのでtrue.
注意:
この操作は-128-127の値にのみ有効です.
m,nの初期値を500に置き換えると,実行結果は両方ともfalseになる.
もう一つの例
public class Test2 {

    public static void main(String[] args) {

       Integer i1 = 256;

        Integer i2 = 256;

        if (i1 = = i2) 

        System.out.println("  !");

        else

        System.out.println("   !");

    }

} 
 
結果は「等しくない!」と出力され、2つのオブジェクトを比較すると、メモリに2つのアドレスが開いているのにどうして等しいのでしょうか.
警告:この結果に頼ってはいけません.i 1とi 2の値を100に変更してください.(Test 3.javaを見てください)どんな結果になったのか見てみると、驚いたことに数を変えて「等しい!」と出力してしまいました.
これは、JVMがこのコードを試す最適化を選択し、2つのIntegerオブジェクトに1つのインスタンスを使用することで、「==」がtrueを返すためです.1つのインスタンスは、自動梱包時に–128~127の値を使用します.
転載先:
1
http://blog.csdn.net/jessieca/archive/2007/10/02/1809944.aspx
2
http://hi.baidu.com/%C0%E4%B0%C1%B5%C4%BB%EA%BB%EA/blog/item/86cdcf0291a580703912bbeb.html