web-dev-qa-db-ja.com

collection.add()とMap.put()の戻り値

Javaでは、Collection.add()はブール値を返します。ブール値は、追加された要素がセットに存在しなかった場合はtrueになり、Map.put()は以前にキーに関連付けられていた値を返します(存在しない場合はnull)。

同じ方法で実装されていない理由はありますか(たとえば、両方がブール値を返す)?

3
Andreas Braun

私はあなたが_Map.put_を意味していると思います-_Map.add_がないからです。ただし、同じ名前であっても、これらのメソッドは動作が異なるため、インターフェースを統一しようとしても意味がありません。

_Collection.add_の戻り値のドキュメント の記述方法を見てください。

呼び出しの結果、このコレクションが変更された場合はtrue

現在、コレクションが変更されない唯一の有効な理由は、セットであり、アイテムが既にそこにある場合です(他の理由でスローする必要があります)が、allコレクション。セットおよび非セットに対して特別な句を作成する必要はありません。

しかし、それは地図にとって意味がありますか?このことを考慮:

_HashMap<Integer, Integer> map = new HashMap<Integer, Integer>();
map.put(1, 2);
map.put(2, 2);

/*case 1*/ map.put(1, 1); // value changed - would have returned `true`
/*case 2*/ map.put(2, 2); // nothing changed - would have returned `false`
/*case 3*/ map.put(3, 3); // key-value pair added - would have returned `true`
_

ケース1と3はどちらもtrueを返しますが、非常に異なります。一方はエントリを上書きし、もう一方は新しいエントリを追加しています。それで、ケース1はfalseを返すはずでしたか?ただし、一方がマップを変更し、もう一方は変更しない場合でも、ケース2と同じになります。

したがって、_Collection.add_の動作を_Map.put_にコピーしても意味がありません。 _Map.put_の動作を_Collection.add_にコピーしてみませんか? _Collection.add_が古い値を返すとどうなりますか?

私はそれにいくつかの問題を見ます:

  1. それはインターフェースをより複雑にします-今度はマップとセットに異なる定義を与えるか、より複雑な定義をする必要があります(例えば-「すでにそこにあったのでアイテムが追加されなかった場合、すでにそこにあったアイテムを返します」。うーん...)
  2. あまり役に立ちません。すでにコレクションに含まれているアイテムがあります-addへの引数として送信しただけです!
  3. カスタムコンパレーターを備えたTreeSetがある場合はどうなりますか?

    _TreeSet<Integer> treeSet = new TreeSet<Integer>((a, b) -> Integer.compare(a % 10, b % 10));
    
    treeSet.add(11);
    treeSet.add(21); // should this return `11` or `21`?
    _

    これはMapの問題ではありません。キーで検索するため、そのキーを要求したときに取得するものを定義する必要があるためです。

  4. これにより、コレクションは実際に値を取得します。 Collection実装がブルームフィルターである場合はどうなりますか?クイックハッシュ照合を行う代わりに、実際にオブジェクトを探す必要があります。データベーステーブルのラッパーの場合はどうなりますか?これで、すでに持っているオブジェクトを作成する必要があります!

    もちろん、Mapにも同様の問題がありますが、少なくとも古い値は重要です。それが何であるかわからず、消えてしまうからです。しかし、Collectionではすべて費用がかかり、利益はありません...

7
Idan Arye

Collection.addは、コレクションが変更されたかどうかを返します。

Map.putは、キーの前の要素を返します。

これらは単に異なる機能です。

Collectionインターフェースには「同等の」メソッドはありません。ただし、List.setがあり、その位置にある前の要素が返されます。マップはコレクションではないことに注意してください。

2
Antonio Parra

どちらのコレクションデザイナーも、メソッドの戻り値を使用して便利なものを提供しようとしました。 addメソッドは、アイテムがすでに存在しているかどうかを通知するだけです。これは、操作したい情報です。

地図から何が得られますか?ほとんどの情報は、キーが持っていた最後の値です。これは、アイテムがすでに存在しているかどうかと、Mapデータ構造のみが持つ別の情報、つまり最後の値の両方を示します。

0
Belgi