1. ホーム
  2. java

[解決済み] Java 8 MapのputIfAbsentとcomputeIfAbsentの違いは何ですか?

2022-10-28 14:53:18

質問

興味深い記事を読んだのですが、2つの機能の違いは何ですか?

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

putIfAbsentは指定されたValueで要素を追加するのに対し 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

computeIfAbsent はマッピング関数を取り、キーが見つからない場合に値を取得するために呼び出されます。

putIfAbsent は値を直接受け取ります。

値を取得するのが高価である場合 putIfAbsent はそのキーがすでに存在する場合、それを無駄にします。

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


相違点その2

computeIfAbsent 指定されたキーに関連付けられた現在の(既存の、または計算された)値、または計算された値がNULLの場合はNULLを返します"。

putIfAbsent 指定されたキーに関連付けられた以前の値、またはそのキーにマッピングがない場合はnullを返します。

つまり、キーがすでに存在する場合は同じものを返しますが、キーがない場合は computeIfAbsent は計算された値を返しますが putIfAbsent はnullを返す。


相違点その3

どちらのメソッドも、キーがない、または既存の値がnullであるとして"absent"を定義していますが。

computeIfAbsent は、キーがない場合、NULL値を置かないようにします。

putIfAbsent は、キーがない場合、値がnullであっても値を入れます。

への今後の呼び出しでは違いはありません。 computeIfAbsent , putIfAbsent そして get のような呼び出しには違いがあります。 getOrDefault containsKey .