Wrapperクラスの代わりにJavaでプリミティブ型を使用するのはなぜですか?すでにJavaにラッパークラスがあることを知りたいのですが、なぜプリミティブ型を使用する必要があるのでしょうか。Javaのプリミティブ型の重要性は何ですか?
4 に答える
あなたの質問は後ろ向きです。プリミティブ型は、ラッパーよりも基本的です。
ラッパーが提供する唯一の便利な点は、Objectのサブクラスとして扱われる機能です(コレクションなどに入れることができます)。本当に便利なもの(算術や順序付けなど)はすべて、プリミティブ型によって提供されます。
次のようなことを言うことができますが、注意してください。
Integer i = Integer.valueOf(4);
Integer j = Integer.valueOf(2);
Integer k = i + j;
これは単なる便利です。その下の最後の行は次のようになります。
Integer k = Integer.valueOf(i.intValue() + j.intValue());
算術がプリミティブ値で発生するようにします。(この便利さはボクシング/アンボクシングとして知られています。)これにはパフォーマンス上のペナルティがあるため、私のマシンでは、このループは次のようになります。
for (int i=0; i<10000000; i++) { }
このループよりも約10倍高速です。
for (Integer i=0; i<10000000; i++) { }
Javaでは、すべてのオブジェクトにある程度のスペースオーバーヘッドがあります。これはJVMと、ターゲットアーキテクチャの「ワード」のサイズ(64ビットと32ビット)によって異なりますが、通常、すべてのオブジェクトには、そのフィールドに必要な量を超える約40バイトの「オーバーヘッド」があると推定されます。 。
したがって、たとえば、1024バイトの配列は1つのオブジェクトであり、40バイトのオーバーヘッドがあります。4バイトを必要とするlength
メンバー(an int
)があり、要素ごとに1バイト、合計で約1kが必要です。
1024Byte
インスタンスの配列には、配列自体とそのlength
メンバーのオーバーヘッドがあり、インスタンスごとに約41バイトがありByte
ます(40バイトのオーバーヘッドとデータ用の1バイト)。全体として、それは41kを超えています!プリミティブ以上のものbyte[]
。
ラッパータイプは不変であるため、プリミティブデータをラップされたオブジェクトインスタンスのように見せるための巧妙なトリックの提案がありますが、これまでのところ、これらのメカニズムはいずれも実装されていません。
パフォーマンス、プリミティブクラスは、多くの操作を実行しなくてもプロセッサにマップされます。
boolean、int、floatの場合、これらを揮発性にし、同期を必要としないようにすることができます(読み取りと書き込みはアトミックです)
[ユーモア]タイピングを節約するために!これ:
int i = 4;
int j = 38;
int k = i + j;
入力するのが短い:
Integer i = new Integer(4);
Integer j = new Integer(38);
Integer k = i + j;
[/ユーモア]
実際には、他の答えは私ができるよりもそれが良いと言っています。