web-dev-qa-db-ja.com

Java-Set.add()が上書きしないのにMap.put()が上書きするのはなぜですか?

JavaのMap.put(key, value)メソッドが、コレクションにすでに存在する同等のキー設定された値を上書きするのに対し、Set.add(value)は、既存の同等の値を上書きしない理由は何でしょうか。すでにコレクションにありますか?

編集:

多数派の視点では、等しいと評価されるセット内のオブジェクトはすべての点で等しくなければならないため、Set.add(Object)が同等の値のオブジェクトを上書きするかどうかは問題ではないようです。 2つのオブジェクトが等しいと評価されても、実際には異なるデータを保持している場合は、Mapタイプのコレクションがより適切なコンテナーです。

私はこの見方にやや同意しません。
例:「Person」オブジェクトのグループを保持するセット。その人物に関する情報を更新するには、セットに新しい更新された人物オブジェクトを渡して、古い古い人物オブジェクトを上書きすることをお勧めします。この場合、個人はその個人を識別する主キーを保持し、セットは主キーのみに基づいて人を識別して比較します。この主キーは、マップなどの外部参照が意味するのとは対照的に、個人のIDの一部です。

21
Chris Dutrow

Mapの動作により、同等のキーに関連付けられた値を変更できます。これはかなり一般的な使用例です。_a : b_は_a : c_になります。

はい、Setの内容をaddで上書きすると、何か(参照値)が変更される可能性がありますが、それはかなり狭いユースケースのようです(とにかく達成できます)。追加する前に必ず削除してください。 s.remove(o); s.add(o);)は、ほとんどの場合に得られるものと比較して、サイクルには何もありません。

編集:

その動作について私が見た可能性のある用途の1つは、メモリバジェットが制限されていること、重いが同等のオブジェクトが多数作成されていること、さまざまな場所で異なる同じバージョンへの参照があること、重複するオブジェクトのガベージコレクションを防ぐことです。しかし、以前にその問題に遭遇したことがあるので、この動作がそれを解決するための最良の方法でさえないと思います。

9
Carl

私の意見では、何も変わらないので、セットで何かを上書きしても意味がありません。

ただし、マップを更新する場合、キーは同じである可能性がありますが、値は異なる可能性があります。

5

Mapは実際にはそれほど違いはないことに注意してください...常に値を変更する可能性がありますが、(少なくともSunの実装では)後でput()を呼び出して、次のように比較される別のインスタンスを使用しても、キーは同じままです。オリジナル。

1
Jules

私はあなたの質問の前提に同意しません。 MapとSetはどちらも抽象インターフェースです。それらが上書きするかどうかは、実装の詳細です。

  1. 上書きしないマップ の実装。
  2. 可変のシングルトンセットを作成できます。セットに何かを追加すると、既存のシングルトン値が上書きされます。
0
emory