💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。
- 推荐:kwan 的首页,持续学习,不断总结,共同进步,活到老学到老
- 导航
非常期待和您一起在这个小小的网络世界里共同探索、学习和成长。💝💝💝 ?? 欢迎订阅本专栏 ??
在 Java 中,putIfAbsent
和 getOrDefault
是用于 Map
接口的两个不同的方法,下面分别解释 putIfAbsent
和 getOrDefault
的用法。
putIfAbsent
方法用于向映射中添加键值对,但仅在指定的键尚不存在时才添加。如果指定的键已经存在,则不会执行添加操作。该方法常用于确保在并发环境中不会重复添加相同的键值对。以下是示例代码:
import java.util.HashMap;
import java.util.Map;
public class PutIfAbsentExample {
public static void main(String[] args) {
Map<String, Integer> map = new HashMap<>();
map.put("key1", 10);
map.putIfAbsent("key1", 20); // 不会覆盖现有键值对
map.putIfAbsent("key2", 30);
System.out.println(map); // 输出: {key1=10, key2=30}
}
}
putIfAbsent
方法在 Java 中通常用于并发环境中的 ConcurrentMap
实现,例如 ConcurrentHashMap
。这个方法的设计是为了在多线程环境下安全地执行添加操作,确保在同一时间只有一个线程能够成功地将键值对添加到映射中。
在 ConcurrentHashMap
中,putIfAbsent
方法使用了一种称为 “compare-and-swap”(CAS)的机制来确保原子性。CAS 是一种多线程同步的技术,它比传统的锁定机制更轻量级。
在 putIfAbsent
方法中,首先会尝试用给定的键检索值,然后只有在该键不存在时才尝试添加。整个过程是原子性的,因此在并发情况下,多个线程可以同时调用 putIfAbsent
方法,但只有一个线程最终会成功地将键值对添加到映射中。
以下是一个简单的示例,演示了在并发情况下使用 ConcurrentHashMap
中的 putIfAbsent
方法:
import java.util.concurrent.ConcurrentHashMap;
public class ConcurrentExample {
public static void main(String[] args) {
ConcurrentHashMap<String, Integer> concurrentMap = new ConcurrentHashMap<>();
// 线程1尝试添加键值对
new Thread(() -> {
Integer value = concurrentMap.putIfAbsent("key", 1);
System.out.println("Thread 1 - Added: " + value);
}).start();
// 线程2尝试添加相同的键值对
new Thread(() -> {
Integer value = concurrentMap.putIfAbsent("key", 2);
System.out.println("Thread 2 - Added: " + value);
}).start();
}
}
在这个例子中,只有一个线程最终会成功地将键值对添加到映射中,而另一个线程会得到 putIfAbsent
方法返回的已存在的值。
putIfAbsent
方法在 ConcurrentMap
中提供了一种并发安全的方式来添加元素,适用于多线程环境。
getOrDefault
方法用于获取指定键的值,如果该键不存在,则返回一个默认值。这个方法对于避免检查键是否存在并处理默认值很有用。
import java.util.HashMap;
import java.util.Map;
public class GetOrDefaultExample {
public static void main(String[] args) {
Map<String, Integer> map = new HashMap<>();
map.put("key1", 10);
map.put("key2", 20);
int value1 = map.getOrDefault("key1", 0); // 存在的键,返回对应的值
int value3 = map.getOrDefault("key3", 0); // 不存在的键,返回默认值 0
System.out.println(value1); // 输出: 10
System.out.println(value3); // 输出: 0
}
}
getOrDefault
方法在 Java 中的 Map
接口中定义,它用于获取指定键对应的值,如果键不存在,则返回一个默认值。这个方法在许多场景下都非常有用,特别是在处理默认值或避免空指针异常的情况下。以下是一些常用的地方:
避免空指针异常: 当你使用传统的 get
方法获取值时,如果键不存在,返回的是 null
。使用 getOrDefault
可以避免因为空值而引发空指针异常。
Map<String, Integer> map = new HashMap<>();
Integer value = map.getOrDefault("key", 0); // 如果键不存在,返回默认值 0
处理默认值: 当你需要获取一个值,如果键不存在则使用一个默认值,而不是 null
。
Map<String, String> config = getConfig(); // 从某处获取配置信息的映射
String username = config.getOrDefault("username", "guest"); // 如果键不存在,返回默认用户名 "guest"
统计元素出现的次数: 在统计元素出现次数时,可以使用 getOrDefault
来为不存在的元素提供一个默认的计数值。
Map<String, Integer> wordCount = new HashMap<>();
String word = "apple";
// 统计单词出现次数
wordCount.put(word, wordCount.getOrDefault(word, 0) + 1);
初始化映射: 在初始化映射时,可以使用 getOrDefault
设置默认值。
Map<String, List<String>> userRoles = new HashMap<>();
// 初始化用户角色列表
userRoles.put("admin", userRoles.getOrDefault("admin", new ArrayList<>()));
getOrDefault
是一个很方便的方法,可以简化代码,提高可读性,并且在处理映射中的键值对时提供了灵活性。
觉得有用的话点个赞
👍🏻
呗。
??????本人水平有限,如有纰漏,欢迎各位大佬评论批评指正!😄😄😄💘💘💘如果觉得这篇文对你有帮助的话,也请给个点赞、收藏下吧,非常感谢!👍 👍 👍
🔥🔥🔥Stay Hungry Stay Foolish 道阻且长,行则将至,让我们一起加油吧!🌙🌙🌙