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/n/368597.html