Java 8 Map の putIfAbsent と computeIfAbsent の違いは何ですか? 質問する

Java 8 Map の putIfAbsent と computeIfAbsent の違いは何ですか? 質問する

興味深い記事を読んでみると、2 つの機能の違いは次の通りだと主張しています。

どちらの関数も、指定されたキーがマップ内にまだ存在しない場合に要素を追加することを目指します。

putIfAbsent は指定された値を持つ要素を追加しますが、computeIfAbsent はキーを使用して計算された値を持つ要素を追加します。http://www.buggybread.com/2014/10/java-8-difference-between-map.html

そして

putIfAbsent によって、if ステートメントを定義するという命令的な方法が削除されることはわかりましたが、Java の記事を取得するとパフォーマンスが本当に低下する場合はどうなるでしょうか。

これを最適化するには、本当に必要だと確信できるまで記事を取得しないようにします。つまり、記事を取得する前にキーが存在しないかどうかを知る必要があるということです。http://www.deadcoderising.com/2017-02-14-java-8-declarative-ways-of-modifying-a-map-using-compute-merge-and-replace/

違いが何なのかよく分かりませんでした。この 2 つの機能について詳しく説明していただけますか?

ベストアンサー1

違いその1

  • computeIfAbsentキーが欠落している場合に値を取得するために呼び出されるマッピング関数を取ります
  • putIfAbsent値を直接取得する

値の取得にコストがかかる場合、putIfAbsentキーがすでに存在すると、そのコストは無駄になります。

一般的な「高価な」値は、new ArrayList<>()たとえば を作成する場合ですMap<K, List<V>>。この場合、キーがすでに存在するときに新しいリストを作成すると (その後新しいリストは破棄されます)、不要なゴミが生成されます。


違いその2

  • computeIfAbsent指定されたキーに関連付けられた現在の(既存のまたは計算された)値を返します。null計算された値がnull
  • putIfAbsent「指定されたキーに関連付けられた以前の値、またはnullキーにマッピングがなかった場合は」を返します。

したがって、キーがすでに存在する場合は同じものを返しますが、キーが欠落している場合はcomputeIfAbsent計算された値を返し、putIfAbsentnull を返します。


違い #3

どちらの方法でも、キーが欠落しているか、既存の値が である場合に「不在」と定義されますnullが、次のようになります。

  • computeIfAbsentnullキーが存在しない場合は値を設定しません
  • putIfAbsentキーが存在しない場合は、値が存在する場合でも値を設定します。null

今後の電話には影響ありませんcomputeIfAbsentputIfAbsent、 そしてget通話では違いがありますが、次のような通話では違いがありますgetOrDefaultそしてcontainsKey

おすすめ記事