Java中的ConcurrentHashMap是線程安全的哈希表,它支持並發的讀和寫操作,由於其高並發的特性,已經成為許多大規模Web應用程序中的首選數據結構之一。這裡,我們將重點介紹其方法之一——javaputifabsent()
一、定義
ConcurrentHashMap的javaputifabsent()方法是一個原子性操作,可以進行插入操作,當指定key不存在時插入一個value值,並返回null,當指定key已經存在時,不進行插入操作,直接返回對應key原來的value值。
二、功能
Java ConcurrentHashMap的javaputifabsent()方法主要有以下三個功能:
1. 插入
當指定key不存在ConcurrentHashMap中時,使用putIfAbsent()方法來插入指定的key-value映射關係,即插入一個新的鍵值對。這是一個原子操作,保證線程安全。
// 創建 ConcurrentHashMap ConcurrentHashMap concurrentHashMap = new ConcurrentHashMap(); // 使用 putIfAbsent() 方法插入指定的 key-value 映射關係 String result1 = concurrentHashMap.putIfAbsent("Java", "Programming"); // 若插入數據成功,putIfAbsent() 方法返回 null。 if (result1 == null) { System.out.println("插入成功!"); } else { System.out.println("插入失敗!"); }
2. 返回插入後的 value
當插入一個新的鍵值對時,putIfAbsent() 方法將返回 null。
// 創建 ConcurrentHashMap ConcurrentHashMap concurrentHashMap = new ConcurrentHashMap(); // 插入新的鍵值對 String result1 = concurrentHashMap.putIfAbsent("Java", "Programming"); if (result1 == null) { System.out.println("插入成功!"); System.out.println("插入後的 value 為:" + concurrentHashMap.get("Java")); } else { System.out.println("插入失敗!"); }
3. 返回已有的 value
如果指定的 key 已經存在於 ConcurrentHashMap 中,putIfAbsent() 方法將不會進行插入操作,而是返回當前存在的原始value值。
// 創建 ConcurrentHashMap ConcurrentHashMap concurrentHashMap = new ConcurrentHashMap(); // 插入已有的 key-value 對 concurrentHashMap.put("Java", "Programming"); // 執行插入的操作 String result1 = concurrentHashMap.putIfAbsent("Java", "Language"); // 返回原始的 value 值 if (result1 == null) { System.out.println("插入成功!"); } else { System.out.println("鍵已存在,原始 value 值為:" + result1); }
三、使用場景
javaputifabsent() 方法在以下2種情況下特別有用:
1. 鍵未指定時插入值
在並發的場景下,若鍵不存在 ConcurrentHashMap 中,插入一個新值時,需要進行同步操作以保證線程安全。如果使用 put(key,value) 方法插入,將會遇到線程競爭的問題。
此時,putIfAbsent()方法非常適合用於將一個key指定到一個value值或者獲取一個已經存在於 ConcurrentHashMap 中的 key,因為該方法是原子操作。
// 創建 ConcurrentHashMap ConcurrentHashMap concurrentHashMap = new ConcurrentHashMap(); if (concurrentHashMap.putIfAbsent("key", "value") == null) { System.out.println("成功插入!"); } else { System.out.println("插入失敗!"); }
2. 防止重複插入
在某些情況下,直接使用put()方法進行數據插入,會導致出現重複數據的現象。而使用putIfAbsent()方法可以避免這種情況的發生。因為它可以在ConcurrentHashMap中進行重複插入檢查,如果鍵值對已存在,它將返回先前存在的映射關係。
// 創建 ConcurrentHashMap ConcurrentHashMap concurrentHashMap = new ConcurrentHashMap(); if (concurrentHashMap.putIfAbsent("key", "value") == null) { System.out.println("插入成功!"); } else { System.out.println("已存在,插入失敗!"); }
結論
javaputifabsent() 是ConcurrentHashMap提供的高效且線程安全的插入方法,支持插入新值和返回已有的原始值。這個方法在很多場景下都非常適合使用,例如:插入不存在的 key 值,防止重複插入等。
原創文章,作者:DGNYG,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/368597.html