モジュール java.base
パッケージ java.util

インタフェースMap<K,V>

型パラメータ:
K - このマップで保持されるキーの型
V - マップされる値の型
既知のすべてのサブインタフェース:
Bindings, ClassPrinter.MapNodePREVIEW, ConcurrentMap<K,V>, ConcurrentNavigableMap<K,V>, NavigableMap<K,V>, SequencedMap<K,V>, SortedMap<K,V>
既知のすべての実装クラス:
AbstractMap, Attributes, AuthProvider, ConcurrentHashMap, ConcurrentSkipListMap, EnumMap, HashMap, Hashtable, Headers, IdentityHashMap, LinkedHashMap, PrinterStateReasons, Properties, Provider, RenderingHints, SimpleBindings, TabularDataSupport, TreeMap, UIDefaults, WeakHashMap

public interface Map<K,V>
キーを値にマッピングするオブジェクトです。 マップには、同一のキーを複数登録できません。各キーは1つの値にしかマッピングできません。

このインタフェースは、インタフェースではなく完全に抽象化されたクラスであるDictionaryクラスのかわりに使用されます。

Mapインタフェースには3つの「コレクション・ビュー」があり、これにより、マップのコンテンツはキーのセット、値のコレクションまたはキーと値のマッピングのセットとして表示できます。 マップの順序は、マップのコレクション・ビューのイテレータが要素を返すときの順序として定義されます。 TreeMapクラスなどの一部のマップ実装では、検出順序について特定の保証を行います。HashMapクラスなどでは保証されません。 定義された「見つける」を持つマップは、通常、SequencedMapインタフェースのサブタイプです。

ノート:可変オブジェクトをマップ・キーとして使用する場合は細心の注意が必要です。 オブジェクトがマップのキーである間にequals比較に影響する方法でオブジェクトの値が変更された場合、マップの動作は指定されません。 この禁止事項の特殊な例として、マップがそれ自身をキーとして持つことができないことが挙げられます。 マップ自体を値として含めることは可能ですが、十分に注意してください: equalsおよびhashCodeメソッドは、このようなマップで適切に定義されなくなりました。

すべての汎用マップ実装クラスは、2つの"standard"コンストラクタを提供する必要があります: 空のマップを作成するvoid (引数なし)コンストラクタと、引数と同じキー値マッピングを持つ新しいマップを作成するMap型の単一の引数を持つコンストラクタ。 その結果、ユーザーは、後者のコンストラクタを使用して任意のマップをコピーすることにより、必要なクラスと等価なマップを作成できます。 これは推奨される方法ではありませんが(インタフェースはコンストラクタを持つことができないため)、JDKでの汎用マップの実装はすべてこれに従っています。

このインタフェースに含まれる"destructive"メソッド、つまり、操作対象のマップを変更するメソッドは、このマップが操作をサポートしていない場合にUnsupportedOperationExceptionをスローするように指定されます。 この場合、これらのメソッドは、呼出しがマップに影響を与えない場合にUnsupportedOperationExceptionをスローする場合がありますが、必須ではありません。 たとえば、マッピングを「重ね合わせる」マップが空の場合に、変更不可能なマップでputAll(Map)メソッドを呼び出すと、例外をスローすることがありますが、必須ではありません。

マップの実装には、格納できるキーと値に制限があるものもあります。 たとえば、nullキーとnull値を禁止する実装や、nullキーの型に制限がある実装もあります。 不適格なキーまたは値を挿入しようとすると、チェックされていない例外(通常はNullPointerExceptionまたはClassCastException)がスローされます。 不適当なキーや値があるかどうかを照会しようとすると、例外がスローされる場合や、ただfalseを返す場合もあります。前者の動作を実行する実装もあれば、後者の動作を実行する実装もあります。 もう少し一般的に言うと、不適当なキーまたは値を処理しようとしてマップへの挿入が完了しない場合、例外がスローされるか成功するかは実装の任意です。 このインタフェースの仕様では、そうした例外は「任意」と記載されています。

Collections Frameworkインタフェース内の多数のメソッドは、equalsメソッドとの関連で定義されます。 たとえば、containsKey(Object key)メソッドの指定では次のようになります : "このマップに(key==null ? k==null : key.equals(k))などのキーkのマッピングが含まれている場合のみ、trueを返します。" この指定は、null以外の引数keyを指定してMap.containsKeyを呼び出すと、キーkに対してkey.equals(k)が呼び出されることを意味するように解釈しないでください。 実装は、2つのキーのハッシュ・コードを最初に比較するなどして、equalsの呼出しを回避する最適化を自由に実装できます。 (Object.hashCode()仕様では、等価ではないハッシュ・コードを保持する2つのオブジェクトは等価ではないことが保証されます。) もう少し一般的に言うと、さまざまなCollections Frameworkインタフェースの実装で、実装者が適切と判断するなら、基本となるObjectメソッドの指定された動作を自由に利用できます。

マップの再帰的トラバースを実行する一部のマップ操作は、マップが自身を直接または間接に含んでいる自己参照インスタンスに対する例外で失敗する場合があります。 これには、clone()equals()hashCode()、およびtoString()メソッドが含まれます。 実装ではオプションで自己参照シナリオを処理できますが、最新の実装では行われていません。

変更不可能なMaps

Map.ofMap.ofEntriesおよびMap.copyOf静的ファクトリ・メソッドを使用すると、変更不可能なマップを簡単に作成できます。 これらのメソッドによって作成されたMapインスタンスには、次の特性があります:

  • それらはunmodifiableです。 キーと値は追加、削除または更新できません。 マップ上で任意のメソッドを呼び出すと、常にUnsupportedOperationExceptionがスローされます。 ただし、含まれているキーまたは値自体が可変である場合、マップの動作が一貫していないか、その内容が変化しているように見える可能性があります。
  • nullキーおよび値は許可されません。 nullキーまたは値でそれらを作成しようとすると、NullPointerExceptionになります。
  • すべてのキーおよび値が直列化可能である場合は、直列化可能です。
  • 作成時に重複キーを拒否します。 静的ファクトリ・メソッドに渡された重複キーは、IllegalArgumentExceptionになります。
  • マッピングの反復順序は指定されず、変更される可能性があります。
  • それらはvalue-basedです。 プログラマは、equalのインスタンスを交換可能として処理し、同期に使用しないようにする必要があります。そうしないと、予期しない動作が発生する可能性があります。 たとえば、将来のリリースでは、同期が失敗する可能性があります。 呼び出し元は、返されたインスタンスのアイデンティティについて何も想定しないでください。 ファクトリは、新しいインスタンスを作成したり、既存のインスタンスを再利用できます。
  • これらは、「直列化された形式」ページで指定したとおりに直列化されます。

このインタフェースは、Java Collections Frameworkのメンバーです。

導入されたバージョン:
1.2
関連項目: