[解決済み] なぜJava MapはCollectionを拡張しないのですか?
質問
ということに驚きました。
Map<?,?>
は
Collection<?>
.
と宣言されれば、LOTの意味があるかと。
public interface Map<K,V> extends Collection<Map.Entry<K,V>>
結局のところ
Map<K,V>
の集合体です。
Map.Entry<K,V>
ということでしょうか?
では、そのように実装されていないのには、何か理由があるのでしょうか?
Cletusが最も権威ある回答をしてくれたことに感謝します。
Map<K,V>
として
Set<Map.Entries<K,V>>
(経由
entrySet()
のように、そのインターフェイスを拡張するだけではありません。
もし
Map
はCollection
は、どのような要素なのでしょうか?唯一の合理的な答えは、「キーと値のペア」です。
その通りです。
interface Map<K,V> extends Set<Map.Entry<K,V>>
があれば最高です。
が、これは非常に限定的な(そして特に有用ではない)ものを提供します。
Map
を抽象化したものです。
しかし、もしそうだとしたら、なぜ
entrySet
インターフェイスで指定されているのでしょうか?それは何らかの形で役に立つに違いありません(その立場を主張するのは簡単だと思います!)。
あるキーがどのような値に対応するかを尋ねることはできませんし、どのような値に対応するかを知らずに、あるキーのエントリーを削除することもできません。
にそれがすべてだとは言いません。
Map
! することができ
すべき
は、他のすべてのメソッド (ただし
entrySet
これはもう冗長です。)
解決方法は?
からの Java Collections API設計に関するFAQ :
<ブロッククオートなぜMapはCollectionを拡張しないのか?
これはデザインによるものです。私たちは マッピングはコレクションではありませんし コレクションはマッピングではありません。したがって を拡張することは、ほとんど意味がありません。 コレクション・インターフェース(またはその逆 のようになります。)
MapがCollectionである場合、そのCollectionは何であるか? 要素になります。唯一の合理的な答えは は、キーと値のペアです。 非常に限定的な(そして 特に有用な)マップの抽象化です。 与えられたキーがどのような値であるかを尋ねることはできません。 へのマッピング、エントリの削除はできません。 を知ることなく、与えられたキーの という値があります。
コレクションは Mapですが、これには疑問が残ります。 キーは何か?本当に 満足な答えがなく、無理に は不自然なインタフェースになる。
マップはコレクションと見なすことができます。 キー、値、またはペア)であり、この事実が は、3つの "コレクション ビュー操作" マップに対する操作(keySet, entrySet、values)の3つです。しかし 原理的には、リストを インデックスを要素にマッピングするMap。 これは、以下のような厄介な性質があります。 リストから要素を削除する は、すべての を削除します。 これがマップビューの理由です。 の操作を行うことができます。
更新してください。 引用文がほとんどの質問に答えていると思います。エントリーのコレクションは特に有用な抽象化ではないという部分を強調する価値があります。例えば
Set<Map.Entry<String,String>>
は許可することになる。
set.add(entry("hello", "world"));
set.add(entry("hello", "world 2"));
(を想定しています。
entry()
を作成するメソッドです。
Map.Entry
のインスタンス)
Map
は一意なキーを必要とするので、これはこれに違反することになります。あるいは、一意のキーを
Set
のエントリの場合、それは実際には
Set
一般的な意味での それは
Set
に、さらに制限を加えたものです。
と言えるかもしれません。
equals()
/
hashCode()
の関係
Map.Entry
は純粋にキーだけでしたが、それにも問題があります。もっと重要なのは、それが本当に付加価値を生むのか、ということです。このような抽象化は、コーナーケースを見始めると、破綻していることに気づくかもしれません。
注目すべきは
HashSet
は、実際には
HashMap
であり、その逆ではありません。これは純粋に実装の詳細ですが、それにしても興味深いことです。
の主な理由は
entrySet()
が存在するのは、キーをトラバースしてそのキーをルックアップする必要がないように、トラバーサルを簡略化するためです。という一応の証拠と捉えてはいけません。
Map
であるべきです。
Set
のエントリーです(イミフ)。
関連
-
この行に複数のマーカーがある - HttpServletResponseが型エラーに解決できない
-
リソースの読み込みに失敗しました。サーバーはステータス500(内部サーバーエラー)で応答しました。
-
Error: java.lang.NoClassDefFoundError: クラス XXXX を初期化できませんでした
-
[解決済み] この2回(1927年)を引き算すると、なぜおかしな結果になるのでしょうか?
-
[解決済み] JavaでInputStreamを読み込んでStringに変換するにはどうすればよいですか?
-
[解決済み] JavaでNullPointerExceptionを回避する方法
-
[解決済み] JavaにおけるHashMapとHashtableの違いは何ですか?
-
[解決済み] Java Mapの各エントリを効率的に反復処理するには?
-
[解決済み] JavaでArrayListではなくLinkedListを使用するのはいつですか?
-
[解決済み] なぜList<T>を継承しないのですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
エラー java.util.NoSuchElementException
-
エラーが報告されました。リソースの読み込みに失敗しました:サーバーは500(内部サーバーエラー)のステータスで応答しました。
-
final, finally, finalizeの違いについて話してください。
-
SpringBootApplication を型解決できない。
-
Enumとの組み合わせでswitchの使い方を一度覚えるために必要な定数式
-
JDKの設定時にjava.dllが見つからない、java SE Runtime Environmentが見つからない問題が発生しました。
-
エラーの解決方法 jarfile XXX.jarにアクセスできません。
-
mavenプロジェクトのテストエラー java.lang.ClassNotFoundException: org.glassfish.jersey.client.ClientConfig の問題を解決する。
-
JSPで「リストが型解決できない!」の解決方法
-
Maven Pluginの実行がライフサイクル設定の対象外であるエラーの解決