タイプが「ボックス化」されているとはどういう意味ですか?
-
07-07-2019 - |
質問
「ボックス化」と呼ばれるタイプについて聞いたことがあります。一部の言語で。
Javaでは、「オートボクシング」と聞いたことがあります。これは何ですか?型のラッパークラスを持っていますか?ボックス化された型またはボックス化されていない型を使用している場合、コードはどのように変わりますか?
解決
一部のデータ型は「プリミティブ」とみなされます。つまり、オブジェクトのように扱われず、オブジェクトのプロパティがありません。
ほとんどのプラットフォームでは、整数と文字はプリミティブですが、ボックス化できる型の例です。
ボクシングとは、オブジェクトの動作を持たせるためにそれらをオブジェクトにラップすることを意味します。
正確な意味と動作は、使用している言語によって異なります。一部の言語(Smalltalkなど...少なくとも私がやっていたときは戻ってきた...)は、プリミティブ型を許可せず、すべてをオブジェクトと見なしますが、それに関連してパフォーマンスが低下します。プロセッサーは、有用な作業を行うために、生の数値と生のメモリーを処理する必要があります。たとえば、ボックス化された2つの整数をバックグラウンドで追加する場合、それらは「アンボックス化」されます。プリミティブ型に数値が追加された後、ボックス化されて新しい整数に戻されます。
他のヒント
Javaの詳細情報:
オートボックスにより、javaは boolean
や int
などをオブジェクトバージョン Boolean
および Integer
に自動的に変換できます。ほとんどの場合。また、逆のことが可能になります。
例:
int a = 3; // no boxing is happening
Integer b = 3; // newer versions of java automatically convert the int 3 to Integer 3
int c = b; // these same versions also automatically convert Integer 3 to int 3
オートボクシング機能を持たない古いバージョンのjavaでは、同じことを行うためにこのコードが必要になります。
int a = 3; // works the same
Integer b = new Integer(3); //must set up a Integer object manually
int c = b.intValue(); //must change Integer object to a primitive
ただし、手動で作業を行う必要があるシナリオがいくつかあります。たとえば、次のような2つのメソッドを持つクラスがあるとします:
assertEquals(int a, int b);
assertEquals(Object a, Object b)
今、これを行おうとすると:
Integer a = 3;
int b = 3;
assertEquals(a, b); // this will not compile
これが機能しないのは、 a
を int
に、または b
をunboxする必要があるかどうかを判断できないためです。 整数
。したがって、どのメソッドシグネチャを呼び出す必要があるかはあいまいです。これを修正するには、次のいずれかを実行できます。
assertEquals((int) a, b);
assertEquals(a, (Integer) b);
はい、ボクシングとは値の型を取得し、参照型にラップすることを意味します。 javaはオートボクシングを導入したため、次のことができます。
void foo(Object bar) {}
//...
foo(1);
そして、javaは自動的にint 1を整数に変換します。以前のバージョンでは、次のことを行う必要がありました。
foo(new Integer(1));
オートボックスは、ジェネリックでプリミティブを使用できないため、ジェネリックで作業するときにjavaで最も役立ちます。リストにintを格納するには、 List< Integer>
を作成する必要があります。そして、ボックス化されたリストにintを入れます。
ボックス化されたタイプは、値がヒープ上のブロックに割り当てられ、ポインターを介して参照されることを意味します。これは、追加のインダイレクションを犠牲にして、ランタイムの実装の均一性に適しています(汎用関数などを簡単に作成できます)。
一般に、コレクションを扱うときは、オブジェクトの配列を扱います。 Javaのような言語では、プリミティブとオブジェクトには違いがあります。プリミティブが「ボックス化」されている場合、それは本質的にプリミティブの単なるラッパーなので、オブジェクトを期待しているフレームワークの残りの部分でうまく動作します。
オートボクシングは、オブジェクトにプリミティブを入れるか、オブジェクトからプリミティブを透過的に引き出すだけの行為であるため、自分で行う追加のステップを心配する必要はありません。
Boxedは、通常の値型を取り、その周りにオブジェクトを作成したことを意味します。箱に入れるようなものです。オブジェクトを構築するオーバーヘッドのため、これは一般に回避する必要があります。