16.対象包装器と自動梱包【Java温故シリーズ】


参考:Javaコア・テクノロジー・ボリューム1
オブジェクトパッケージと自動梱包
  • 対象パッキン
  • 2自動梱包
  • 1対象パッケージ
    intのような基本タイプをオブジェクトに変換する必要がある場合があります.すべての基本タイプには対応するクラスがあります.例えば、Integerクラスは基本タイプintに対応する.通常、これらのクラスは包装器と呼ばれます.これらのオブジェクトパッケージクラスには、Integer、Long、Float、Double、Short、Byte、Character、VoidとBoolean(最初の6つのクラスは共通のスーパークラスNumberから派生しています).オブジェクトパッケージクラスは可変ではありません.つまり、パッケージが構築されると、パッケージの値を変更することはできません.また、オブジェクトパッケージはfinalなので、サブクラスを定義することはできません.
    整数配列リストを定義し、カッコ内のタイプパラメータが基本タイプであることを許可しない場合は、Integerオブジェクトパッケージクラスを使用する必要があります.
    ArrayList<Integer> list = new ArrayList<>();
    

    注意:各値がオブジェクトにパッケージされているため、ArrayListの効率はint[]配列よりはるかに低い.したがって,一般にはそれだけで小型集合を構築する(操作が容易である).
    オブジェクトラッピングオブジェクトの比較:
    "=="を使用して2つのオブジェクトパッケージオブジェクトを比較すると、オブジェクトが同じストレージ領域を指しているかどうかを検出します.したがって、次の比較は通常は成立しません.
    Integer a = 1000;
    Integer b = 1000;
    System.out.println(b==a);  //false
    

    したがって,オブジェクトパッケージ値の比較にはequalsメソッドを呼び出す必要がある.
    パッケージにいくつかの基本的な方法を配置します.
    たとえば、数値文字を数値に変換します.
    int x = Integer.parseInt(s);  //    s
    

    parseIntは静的メソッドであり,Integerオブジェクトとは関係ないが,integerはこのメソッドをうまく配置できる.
    2自動梱包
    intタイプの要素をArrayListに追加するのに便利な機能があります.
    list.add(3);
    

    自動変換:
    list.add(Integer.valueOf(3));
    

    この変換を自動梱包と呼ぶ.
    逆に、Integerオブジェクトをint値に割り当てると、自動的にボックスが取り外されます.
    int n = list.get(i);   //  list        i   
    

    コンパイラは次のように翻訳されます.
    int n = list.get(i).intValue();
    

    算術式でも自動的に箱詰めと解体が可能:自己増分オペレータをパッケージ参照に適用
    Integer n = 3;
    n++;
    

    コンパイラは、オブジェクトの分解命令を自動的に挿入し、自己増加計算を行い、結果を箱詰めします.
    自動梱包の説明:
    1)パッキン類参照はnullとすることができるため、自動梱包で異常が放出される可能性がある(nullで数値演算)
    2)1つの条件式でIntegerとDoubleタイプを混合して使用すると、Integer値はボックスから取り外され、doubleに昇格し、Doubleに再梱包される
    3)梱包と解体は、仮想マシンではなくコンパイラによって認められています.コンパイラはバイトコードを生成するときに、必要なメソッド呼び出しを挿入します.仮想マシンは、これらのバイトコードを実行するだけです.