2011-01-04 20 views
10

可能性の重複:
storing primitive values in a java collection?Javaコレクション。プリミティブ型はなぜですか?

私のJavaの教科書は、例えばArrayListには、プリミティブ型にすることはできません、コレクションの要素を言います。これには理由がありますか?私は、Sunの誰かがこれを決定したのですか、それを行うことに対して何らかの障壁がありますか? ArrayListはオブジェクトを必要とし、プリミティブはオブジェクトではないので、私の例で半分の答えが分かります。しかし、私はなぜ彼らもプリミティブ型を持つことができないと思う?

答えて

2

すべてのプリミティブ型を表す「ラッパー」と呼ばれるオブジェクトがあります。たとえば、Integerというクラスがあり、intをサポートしています。プリミティブラッパーを使用すると、Collection内の値を保持できます。

プリミティブ型(少なくともJava 5まで)の問題は、ベースのObjectクラスから拡張されていないということです。すべてのコレクションでは、使用しているすべてのメソッドのクラスを指定する必要があります。Objectはすべてのクラスのベースであるため、Objectを指定します。

Java 5では、必要に応じてJavaがプリミティブとそれに対応するラッパークラスを暗黙的に切り替えます。つまり、intまたはdoubleなどをコレクションに追加できます。 VMは自動的にプリミティブをラッパークラスにラップし、ラッパーをCollectionに配置します。

+6

"プリミティブ型の問題(少なくともJava 5まで)" ...以降のバージョンも。オートボクシングが行われていますが、プリミティブ型の共通基底クラスはまだありません。 –

5

保存開封されたプリミティブは劇的コレクションコードが複雑になります。一方、ラッパー(のintなど)では、コードはかなり簡単です。今やJavaは「自動ボックス化」をサポートしています。つまり、にIntegerと入力すると、はIntegerインスタンスにラップされます(またその逆もあります)。

1

この記事をウィキペディアで読む。それが役立つかもしれない:コンピュータサイエンスのhttp://en.wikipedia.org/wiki/Object_type_(object-oriented_programming)#Autoboxing

、オブジェクトタイプ (別名ラップオブジェクト)はそれのように見えるように非オブジェクト型 をラップするオブジェクト指向 プログラミングで使用されるデータ型 です動的オブジェクト。

いくつかのオブジェクト指向プログラミング 言語はしばしば は、 ランタイムなどの理由のために、存在しない複合値型 プラットフォーム上のオブジェクトおよび非オブジェクト と呼ばれる、 基準と値型の間の区別を行います効率性と構文または セマンティクスの問題。例えば、Javaは 各プリミティブ型に対応 プリミティブラッパークラスがあります 整数と整数、文字と文字、 フロートとフロート等 参照タイプのほとんど又は全く概念を有する++ Cのような言語を、したがって、オブジェクトタイプの使用はほとんど興味がありません。

ボクシングオブジェクトプリミティブが 参照オブジェクトとして使用できるよう 内のプリミティブ型を配置する工程です。たとえば、リスト には、配列 がないかもしれない特定のメソッドが含まれていますが、リストには のすべてのメンバーが 動的オブジェクトであることが必要な場合もあります。この場合、一覧の 機能は を の単純な配列で使用できなくなる可能性があります。より具体的な例として、Javaの の場合、LinkedListは のサイズを変更できますが、配列のサイズは固定の でなければなりません。 intのLinkedListを持つことを望むかもしれませんが、LinkedList クラスは、動的な オブジェクトへの参照のみをリストします。値型であるプリミティブ の型はリストできません。これを回避するために

は、int値は、動的 オブジェクトは整数、に 箱入り、その後整数の LinkedListのに追加することができます。 (J2SE 5.0で導入されたジェネリック パラメータ化された型を使用して、このタイプは、LinkedListのように表される。)他の に対し、C#がないプリミティブラッパー クラスを有していないが、一般的なオブジェクト 参照を返す、任意 値型のボクシングを可能にします。

ボックスオブジェクトは常に値オブジェクトの のコピーであり、通常は 不変です。オブジェクトをアンボックスすると、 は保存された値のコピーを返します。それは動的に新しいオブジェクトを割り当て と はその後、ガベージコレクション のためにそれらを対象となりますので、オブジェクトのボクシングとアンボクシング を繰り返し 注意、厳しい パフォーマンスへの影響を持つことができます。

7

それをやっに対するいくつかの障壁があるのでしょうか?

あなたは、例えば、テーラーは、非クラスタイプのいずれかを保存するためになされたArrayListのほぼ同じバージョンを書くことができますIntegerArrayListなど。これに対する障壁は、プリミティブ型の数にコレクション型の数を掛けるように、そのようなクラスが爆発することです。標準的なコレクションの枠組みを管理しやすくするために、これは除外されました。

これをよりうまく解決するには、プリミティブ型を型パラメータとして使用し、配列とジェネリック間の相互作用を改善するためのジェネリックが必要です。

0

パフォーマンスの問題は、これを達成するために自動ボクシングが必要なため、問題の1つです。また、構造体の中には、ヌル値を持つことで利益を得るものもあります。

1

現在、プリムティクスをコレクションに直接格納する唯一の方法は、プリミティブタイプごとにコレクションを持つことです。 TIntArrayList。

ArrayListがプリミティブを使用するよりも速度が遅いにもかかわらず、使用例が90%以上で十分に高速です。

関連する問題