Java は、キーと値のペアを効率的に格納するために広く使用されている 2 つのデータ構造、HashMap と Map を提供します。どちらも同様の機能を提供しますが、使用法と実装には微妙な違いがあります。
Java では、HashMap インターフェイスと Map インターフェイスの両方を使用してマップを作成できます。ただし、アクセスできるインターフェイスに関しては大きな違いがあります。
HashMap<String, Object> map = new HashMap<String, Object>(); // Declares a specific HashMap Map<String, Object> map = new HashMap<String, Object>(); // Declares the interface Map
最初の例では、マップの実装として HashMap を明示的に指定します。対照的に、2 番目の例では、Map インターフェイスを使用します。これにより、コントラクトを破ることなく、後で基になる実装を変更できます。
どちらのオプションも機能します。マップでは、Map インターフェイスを使用すると、柔軟性という重要な利点が得られます。マップをインターフェイスとして宣言すると、それらを使用するコードに影響を与えることなく、基礎となる実装を変更できます (例: HashMap から TreeMap または別のマップ タイプ)。
逆に、HashMap を明示的に宣言すると、コントラクトを破る危険があります。また、後で実装を切り替える必要がある場合はコードの変更が必要になります。たとえば、代わりに TreeMap を使用することにした場合、それらのマップにアクセスするコードをそれに応じて更新する必要があります。
マップをインターフェイスとして宣言することの重要性を説明するには、次のことを考えてください。次の例:
class Foo { private Map<String, Object> things; // Declares a Map interface // ... Class methods and constructors omitted for brevity } class SpecialFoo extends Foo { private void doSomething(Map<String, Object> t) { // Declares a Map interface // ... } // ... Class methods and constructors omitted for brevity }
この例では、Foo は一般的な Map インターフェイスを使用して内部マップを宣言し、柔軟性と基礎となる実装からの分離を提供します。 SpecialFoo の doSomething メソッドは、パラメータに Map インターフェイスも使用するため、Map の任意の実装で動作することができます。
Foo がその実装を HashMaps から TreeMaps に変更したとしても、SpecialFoo は相互作用するだけであるため、引き続き正しく機能します。マップインターフェイスを使用します。対照的に、Foo の内部マップが HashMap として明示的に宣言されている場合、SpecialFoo は壊れるので、型の変更に対応するために更新する必要があります。
原則として経験則から言えば、ニーズを満たす最も一般的なインターフェイスにコーディングすることをお勧めします。このアプローチにより、将来の実装変更に対する柔軟性と回復力が向上します。
具体的に指定する必要がある場合も時々ありますが、多くの場合、参照をできるだけ基本的かつ唯一のものとして宣言する方が安全であり、破壊的な変更が発生する可能性が低くなります。必要に応じて正確なタイプを指定します。この原則は、コードの安定性を維持し、進化する要件に確実に適応できるようにするのに役立ちます。
以上がJava で Map Over HashMap を使用する必要があるのはどのような場合ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。