1. ラッパーの種類の一覧

Java には 8 つのプリミティブ型 (クラスではない型) があることはご存知でしょう。一方で、これは良いことです。シンプルで場所もほとんどとりません。一方で、授業だけが必要な場合もあります。その理由については、次のレッスンで詳しく説明します。

それで何ができるでしょうか?

Java の 5 番目のバージョンから、各プリミティブ型にツイン クラスが追加されました。このような各クラスは、特定の型の値を持つ単一のフィールドを格納します。これらのクラスは、クラス内のプリミティブ値をラップするため、ラッパー型と呼ばれます。

これらのタイプのリストを次に示します。何でも知ってますか?

プリミティブ型 ラッパークラス
byte
Byte
short
Short
int
Integer
long
Long
float
Float
double
Double
char
Character
boolean
Boolean

プリミティブ型の名前は小文字で始まりますが、ラッパー クラスの名前は大文字で始まります。一部のクラス名は少し長いものもあります: Integerinstead of intи Characterinstead of char

ラッパー クラスのすべてのオブジェクトは変更不可能 ( immutable ) です。

クラスの簡略化されたコードはInteger次のようになります。

コード ノート
public class Integer
{
   private int value;

   Integer(int x)
   {
      this.value = x;
   }

   public int intValue()
   {
      return this.value;
   }

   public static Integer valueOf(int x)
   {
      return new Integer(x);
   }
}


変数

コンストラクター




メソッドは値を返します




静的メソッドは変数Integerの新しいオブジェクトを作成しますint

2. をintに変換するInteger

ラッパー型は、プリミティブの兄弟に対応するものとみなされます。プリミティブ型に対応するラッパー オブジェクトを簡単に作成できます。

int 型を例として使用して、プリミティブ型が対応するラッパー型とどのように相互作用するかを分析してみましょう。intからへInteger、またはその逆に変換するコードは次のようになります。

intを に変換するにはInteger、次のコードを記述する必要があります。

Integer name = new Integer(value);

ここでname、 は変数の名前Integer、 はvalueラップされたint値です。

例:

コード ノート
Integer age = new Integer(18);
Integer hundred = new Integer(100);
Integer zero = new Integer(0);

an をIntegeran に変換するにはint、次のコードを記述する必要があります。

int name = variable.intValue();

ここでname、 は変数の名前int、 はオブジェクトvariableへの参照ですInteger

例:

コード ノート
Integer age = new Integer(18);
int x = age.intValue();

x == 18
Integer hundred = new Integer(100);
int y = hundred.intValue();

y == 100
Integer zero = new Integer(0);
int z = zero.intValue();


z == 0
int i = 110;
Integer zero = new Integer(i);
int z = zero.intValue();

z == 110

3. オートボックス化とアンボックス化

しかし、Integer型を使った単純な操作ですら書くのは簡単ではありません。

前に述べたように、Integer型は変更不可能 ( immutable ) です。Integer新しい値を持つオブジェクトを作成するにはint、新しいオブジェクトを明示的に作成する必要がありますIntegerintとはいえ、オブジェクト内に格納されているの値を取得するのは簡単ですInteger。メソッドを呼び出すだけですintValue()

例:

コード 説明
Integer a = Integer.valueOf(5);
int b = a.intValue();
Integer c = new Integer(b + 5)
オブジェクト5でラップするオブジェクト から値を取得する 新しいオブジェクトを作成する (10 に等しい)Integer
Integer
Integer

これはかなり面倒なコードだと思いませんか?

Java の作成者はそう考え、これらの操作を自動的に実行する方法をコンパイラーに教えました。intanから an への自動変換はオートボックス化(値をボックスに自動的に入れる)Integerと呼ばれ、その逆の操作 (anから への変換) はアンボックス化と呼ばれます。Integerint

あなたのコード コンパイラが認識するもの
Integer a = 10;
Integer a = Integer.valueOf(10);
int b = a;
int b = a.intValue();
Integer c = a + b;
Integer c = Integer.valueOf(a.intValue() + b);

オートボックス化とボックス化解除のおかげで、 を変数intに安全に代入したりInteger、その逆を行うことができます。intと の型を区別することなく、あらゆる複雑な式を作成できますInteger

例:

コード コンパイラが生成するもの
Integer a = 5;
int b = a;
Integer c = a + b;
int d = a + b + c;
Integer a = Integer.valueOf(5);
int b = a.intValue();
Integer c = Integer.valueOf(a.intValue() + b);
int d = a.intValue() + b + c.intValue();
Integer a = 5;
int b = 5;

if (a == b)
{
   ...
}
Integer a = Integer.valueOf (5);
int b = 5;

if (a.intValue() == b)
{
   ...
}


4. ラッパー変数の比較

自動ボックス化とボックス化解除は、シンプルで透過的なプロセスです。必要に応じてステートメントを使用しnew Integer()intValue()必要に応じてメソッドを呼び出します。

プログラマにとっては、すべてがうまく簡単に機能します。と を比較する場合、比較は値ではなく参照に基づいて行われることに注意してください。IntegerInteger

コード コンソール出力
Integer a = 1000;
Integer b = 1000;

System.out.println(a == b);



false
Integer a = 1000;
Integer b = 1000;

System.out.println(a.equals(b));



true

および変数aには値はb格納されませんint。オブジェクトへの参照を保存します。つまり、それらを正しく比較する方法を覚えておくことが重要です。

間違い
Integer a = 1000;
Integer b = 1000;
if (a == b)
{
   ...
}
Integer a = 1000;
Integer b = 1000;
if (a.equals(b))
{
   ...
}