[解決済み] Java 8 MapのputIfAbsentとcomputeIfAbsentの違いは何ですか?
質問
興味深い記事を読んだのですが、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
.
関連
-
IDEAError:javaの依存性エラー。Annotation processing is not supported for module cycles...(アノテーション処理はモジュールサイクルではサポートされていません。
-
[解決済み] JavaにおけるHashMapとHashtableの違いは何ですか?
-
[解決済み] Java Mapの各エントリを効率的に反復処理するには?
-
[解決済み] Javaにおけるpublic、protected、package-private、privateの違いは何ですか?
-
[解決済み] serialVersionUIDとは何ですか、またなぜそれを使用する必要がありますか?
-
[解決済み] StringBuilderとStringBufferの違いについて
-
[解決済み] wait()とsleep()の違いについて
-
[解決済み] Javaクラスにおけるcanonical name、simple name、class nameの違いは何ですか?
-
[解決済み] JDKとJREの違いは何ですか?
-
[解決済み] Java 8のmap()メソッドとflatMap()メソッドの違いは何ですか?
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
スレッド "main "での例外 java.util.NoSuchElementException in Java 問題解決済み
-
undefined[sonar] sonar:デフォルトのスキャンルール
-
java.sql.SQLException: executeQuery()でデータ操作文を発行できません。
-
javaの非静的メソッドを静的に参照することができない
-
強制型変換について
-
名前 'XXX' を持つ Bean の作成に失敗しました。自動依存関係の注入に失敗しました 解決方法
-
java.sql.SQLException: 結果セットの開始前
-
keytool error: java.io.FileNotFoundException: cacerts (アクセス拒否されました。)
-
Java JDKのダイナミックプロキシ(AOP)の使用と実装の原理分析
-
アクセス制限の解決方法: ---- in Java