1. 概要

名前が示すように、ラッパークラスは、プリミティブJavaタイプをカプセル化するオブジェクトです。

各Javaプリミティブには、対応するラッパーがあります。

  • boolean、byte、short、char、int、long、float、double 
  • ブール値、バイト、ショート、文字、整数、ロング、フロート、 ダブル

これらはすべてjava.lang パッケージで定義されているため、手動でインポートする必要はありません。

2. ラッパークラス

「ラッパークラスの目的は何ですか?」 これは、最も一般的なJava面接の質問の1つです。

基本的に、ジェネリッククラスはオブジェクトでのみ機能し、プリミティブをサポートしません。 その結果、それらを操作する場合は、プリミティブ値をラッパーオブジェクトに変換する必要があります。

たとえば、Javaコレクションフレームワークはオブジェクトのみを処理します。 (Java 5より前のほぼ15年前)オートボクシングがなかった昔、たとえば、整数のコレクションに対して add(5)を呼び出すことはできませんでした。

当時、これらのプリミティブ値は、手動で対応するラッパークラスに変換し、コレクションに保存する必要がありました。

現在、オートボクシングを使用すると、 ArrayList.add(101)を簡単に実行できますが、Javaは、プリミティブ値を ArrayList に格納する前に、内部でIntegerに変換します。 the valueOf()method

3. プリミティブからラッパークラスへの変換

ここで大きな問題は、プリミティブ値を対応するラッパークラスにどのように変換するかです。 intから整数またはcharから文字?

コンストラクターまたは静的ファクトリメソッドを使用して、プリミティブ値をラッパークラスのオブジェクトに変換できます。

ただし、Java 9以降、IntegerLongなどの多くのボックス化されたプリミティブのコンストラクターは非推奨になりました。

したがって、新しいコードではファクトリメソッドのみを使用することを強くお勧めします。

int値をJavaのIntegerオブジェクトに変換する例を見てみましょう。

Integer object = new Integer(1);

Integer anotherObject = Integer.valueOf(1);

valueOf()メソッドは、指定されたint値を表すインスタンスを返します。

キャッシュされた値を返すため、効率的です。 常に-128〜127の値をキャッシュしますが、この範囲外の他の値をキャッシュすることもできます。

同様に、 booleanからBoolean、byteからByte、charからCharacter、longからLong、floatに変換することもできます。 からFloat、および doubleからDouble。ただし、文字列を整数に変換する必要がある場合は、[ String はラッパークラスではないため、X284X] parseInt()メソッド。

一方、ラッパーオブジェクトからプリミティブ値に変換するには、intValue()、doubleValue()などの対応するメソッドを使用できます。

int val = object.intValue();

包括的なリファレンスはここにあります。

4. オートボクシングとアンボクシング

前のセクションでは、プリミティブ値をオブジェクトに手動で変換する方法を示しました。

Java 5以降、この変換は、オートボクシングおよびアンボクシングと呼ばれる機能を使用して自動的に実行できます。

「ボクシング」とは、プリミティブ値を対応するラッパーオブジェクトに変換することを指します。これは自動的に行われる可能性があるため、オートボクシングと呼ばれます。

同様に、ラッパーオブジェクトがプリミティブ値にアンラップされると、これはアンボックス化と呼ばれます。

これが実際に意味することは、ラッパーオブジェクト を期待するメソッドにプリミティブ値を渡すか、オブジェクトを期待する変数にプリミティブを割り当てることができるということです。

List<Integer> list = new ArrayList<>();
list.add(1); // autoboxing

Integer val = 2; // autoboxing

この例では、Javaはプリミティブint値をラッパーに自動的に変換します。

内部的には、 valueOf()メソッドを使用して変換を容易にします。 たとえば、次の行は同等です。

Integer value = 3;

Integer value = Integer.valueOf(3);

これにより、変換が簡単になり、コードが読みやすくなりますが、場合によってはオートボクシングを使用するべきではありません。 ループ内 。

オートボクシングと同様に、プリミティブを期待するメソッドにオブジェクトを渡すとき、またはプリミティブ変数にオブジェクトを割り当てるときに、ボックス解除が自動的に行われます。

Integer object = new Integer(1); 
int val1 = getSquareValue(object); //unboxing
int val2 = object; //unboxing

public static int getSquareValue(int i) {
    return i*i;
}

基本的に、プリミティブ値またはラッパーオブジェクトを受け入れるメソッドを記述した場合でも、両方の値をそれらに渡すことができます。 Javaは、正しい型の受け渡しを処理します。 コンテキストに応じてプリミティブまたはラッパー。

5. 結論

このクイックチュートリアルでは、Javaのラッパークラスと、自動ボックス化およびボックス化解除のメカニズムについて説明しました。