2017-10-26 64 views
1

マップのインスタンス化時にいくつかのセマンティクスに関する質問があります。具体的には、キーと値の型を割り当てるときにWrapperクラスを使用する必要がありますか、それともプリミティブ型を使用することはできますか?マップのインスタンス化時にキーと値としてラッパークラスを使用します。

例:

Map<int, String> map = new TreeMap<int, String>(); 

OR

Map<Integer, String> map = new TreeMap<Integer, String>(); 

例:

Map<int[], String> map = new TreeMap<int[], String>(); 

OR

Map<Integer[], String> map = new TreeMap<Integer[], String>(); 

慣例と意味の両方の点で2つのインスタンス化に違いはありますか?私はプリミティブ型を使用して、オブジェクトが読み書きされたときにオートボクシングを呼び出すことを知っています。

+2

実際にコンパイルされたものを確認するためにこれらのオプションを試しましたか? –

+0

ようこそ。少なくとも、コードスニペットのいずれかがコンパイルされているかどうかを確認することができます。 – c0der

+0

コンパイル後にWrapperクラスのみが使用できます。 – Teju

答えて

3

primitivesに類似)Value Typesを実装しますラッパークラスを使用する必要があります(つまり、このユースケースにはMap<Integer, String>)。 は、このようなクラスのメソッドを呼び出すときプリミティブはmyMap.put(7, 'Some String')、例えば(autoboxedされるであろう。

配列が別の質問です。あなたが使うことができるようにプリミティブの配列は、実際のオブジェクトであるあなたは、もちろん、まだ、プリミティブを使用することができますしかし、配列はequals(Object)hashCode()のメソッド(プリミティブやオブジェクトの配列であるかどうかに関係なく)をオーバーライドしないため、マップキーの選択肢は非常に悪いです。

+0

第2段落のための親指。 –

1

Primitivesはジェネリックでは使用できません。だからあなたはWrapper Typesを使用する持っている。

しかし、Java配列が常にobjectsであるため、プリミティブ配列の使用は問題ありません。

プリミティブを使用する場合は、Project Valhallaをご覧ください。これはJavaでごみの多くを取り除くしたいとあなたがますので、あなたが(例えば、あなたが上に示唆Map<int, String>として)ジェネリック型の仕様でプリミティブ型を使用することはできません

+0

プライマリタイプとはプリミティブを意味しますか? – c0der

+0

@ c0derああ、ありがとう、固定したそれ – Lino

1

マップは許可されていませんprimitiveタイプはkeyまたはvalueです。int[]Java docarrayObjectです。

カスタムオブジェクトをkey/valueとして使用する場合は、そのクラスを不変にするか、hashCode()equals()メソッドをオーバーライドする必要があります。

関連する問題