共计 4368 个字符,预计需要花费 11 分钟才能阅读完成。
在之前的文章中曾经为大家介绍了 java 并发编程的工具:BlockingQueue 接口、ArrayBlockingQueue、DelayQueue、LinkedBlockingQueue、PriorityBlockingQueue、SynchronousQueue、BlockingDeque 接口,本文为系列文章第八篇。
因为 Java 程序员罕用的 HashMap 的操作方法不是同步的,所以在多线程环境下会导致存取操作数据不统一的问题,Map 接口的另一个实现类 Hashtable 尽管是线程平安的,然而在多线程下执行效率很低。为了解决这个问题,在 java 1.5 版本中引入了线程平安的汇合类ConcurrentMap。
java.util.concurrent.ConcurrentMap
接口是 Java 汇合类框架提供的线程平安的 map,这意味着多线程同时拜访它,不会影响 map 中每一条数据的一致性。ConcurrentMap 接口有两个实现类 ConcurrentHashMap 和 ConcurrentSkipListMap,常常被应用的是 ConcurrentHashMap,咱们来重点关注它。
1. 创立 ConcurrentHashMap 对象
通过上面的代码创立 ConcurrentHashMap
// 创立容量为 8,负载系数为 0.6 的 ConcurrentHashMap
ConcurrentHashMap<Key, Value> numbers = new ConcurrentHashMap<>(8, 0.6f);
应用下面的代码,咱们创立一个叫做 numbers 的 ConcurrentHashMap 对象。
- Key – 用于关联 Map 中每个元素的惟一标识
- Value – Map 中每个元素,能够通过 key 值获取 value
须要咱们特地留神的是new ConcurrentHashMap<>(8, 0.6)
.
- capacity 容量 – 第一个参数示意这个 map 的容量是 8,也就是说这个对象能够存储 8 个键值对.
- loadFactor 负载因子 – 这个 map 对象的负载因子是 0.6. 这意味着,每当咱们的哈希表被填满 60% 的时候,条目就会被挪动到一个新的哈希表,其容量大小是原来哈希表的两倍。
默认容量与负载因子
咱们还能够通过上面的代码初始化一个 ConcurrentHashMap 对象,默认状况下 capacity=16,loadFactor=0.75
ConcurrentHashMap<Key, Value> numbers1 = new ConcurrentHashMap<>();
2.ConcurrentHashMap 罕用办法
2.1. 向 ConcurrentHashMap 插入元素
put(K,V)
– 向 map 中插入 key/value 键值对数据putAll(map)
– 把另一个 map 中的所有 entries 插入到以后的 map 中putIfAbsent(K,V)
– 向 map 中插入 key/value 键值对数据,如果该键值对的 key 在 map 不存在则插入数据,否则不做操作。
import java.util.concurrent.ConcurrentHashMap;
class Main {public static void main(String[] args) {
// 创立 ConcurrentHashMap 用于保留偶数
ConcurrentHashMap<String, Integer> evenNumbers = new ConcurrentHashMap<>();
// 应用 put()办法插入数据
evenNumbers.put("Two", 2);
evenNumbers.put("Four", 4);
// 应用 putIfAbsent()插入数据
evenNumbers.putIfAbsent("Six", 6);
System.out.println("偶数汇合 ConcurrentHashMap:" + evenNumbers);
// 创立 ConcurrentHashMap 用于保留整数
ConcurrentHashMap<String, Integer> numbers = new ConcurrentHashMap<>();
numbers.put("One", 1);
// 应用 putAll()插入数据
numbers.putAll(evenNumbers);
System.out.println("整数汇合 ConcurrentHashMap:" + numbers);
}
}
输入后果:
偶数汇合 ConcurrentHashMap: {Six=6, Four=4, Two=2}
整数汇合 ConcurrentHashMap: {Six=6, One=1, Four=-4, Two=2}
2.2. 批量获取 ConcurrentHashMap 元素
entrySet()
– 获取 map 中 key/value 键值对汇合keySet()
– 获取 map 中所有的 key 的汇合values()
– 获取 map 中所有的 value 的汇合
import java.util.concurrent.ConcurrentHashMap;
class Main {public static void main(String[] args) {ConcurrentHashMap<String, Integer> numbers = new ConcurrentHashMap<>();
numbers.put("One", 1);
numbers.put("Two", 2);
numbers.put("Three", 3);
System.out.println("ConcurrentHashMap:" + numbers);
// 获取 map 中 key/value 键值对汇合
System.out.println("Key/Value mappings:" + numbers.entrySet());
// 获取 map 中所有的 key 的汇合
System.out.println("Keys:" + numbers.keySet());
// 获取 map 中所有的 value 的汇合
System.out.println("Values:" + numbers.values());
}
}
输入后果
ConcurrentHashMap: {One=1, Two=2, Three=3}
Key/Value mappings: [One=1, Two=2, Three=3]
Keys: [One, Two, Three]
Values: [1, 2, 3]
2.3. 获取指定 Key 元素的 value 值
get()
– 获取指定 key 元素的 value 值,如果 key 不存在返回 nullgetOrDefault()
– 获取指定 key 元素的 value 值,如果 key 不存在返回一个指定的默认值
import java.util.concurrent.ConcurrentHashMap;
class Main {public static void main(String[] args) {ConcurrentHashMap<String, Integer> numbers = new ConcurrentHashMap<>();
numbers.put("One", 1);
numbers.put("Two", 2);
numbers.put("Three", 3);
System.out.println("ConcurrentHashMap:" + numbers);
// 获取指定 key 元素的 value 值,如果 key 不存在返回 null
int value1 = numbers.get("Three");
System.out.println("Using get():" + value1);
// 获取指定 key 元素的 value 值,如果 key 不存在返回一个指定的默认值
int value2 = numbers.getOrDefault("Five", 5);
System.out.println("Using getOrDefault():" + value2);
}
}
输入后果
ConcurrentHashMap: {One=1, Two=2, Three=3}
Using get(): 3
Using getOrDefault(): 5
2.4. 移除 ConcurrentHashMap 中的元素
remove(key)
– 依据指定的 key 删除 map 中的元素,并将该元素返回remove(key, value)
– 只有当 map 中存在指定的键映射到指定的值时,才会从 map 中删除条目,并返回一个布尔值。返回 true 示意删除胜利,否则示意 map 中没有这个键值对。
import java.util.concurrent.ConcurrentHashMap;
class Main {public static void main(String[] args) {ConcurrentHashMap<String, Integer> numbers = new ConcurrentHashMap<>();
numbers.put("One", 1);
numbers.put("Two", 2);
numbers.put("Three", 3);
System.out.println("ConcurrentHashMap:" + numbers);
// 依据指定的 key 删除 map 中的元素,并将该元素返回
int value = numbers.remove("Two");
System.out.println("Removed value:" + value);
// 只有当 map 中存在指定的键映射到指定的值时,才会从 map 中删除条目,并返回一个布尔值。boolean result = numbers.remove("Three", 3);
System.out.println("Is the entry {Three=3} removed?" + result);
System.out.println("Updated ConcurrentHashMap:" + numbers);
}
}
输入后果
ConcurrentHashMap: {One=1, Two=2, Three=3}
Removed value: 2
Is the entry {Three=3} removed? True
Updated ConcurrentHashMap: {One=1}
欢送关注我的博客,外面有很多精品合集
本文转载注明出处(必须带连贯,不能只转文字):字母哥博客 – zimug.com
感觉对您有帮忙的话,帮我点赞、分享!您的反对是我不竭的创作能源!。另外,笔者最近一段时间输入了如下的精品内容,期待您的关注。
- 《手摸手教你学 Spring Boot2.0》
- 《Spring Security-JWT-OAuth2 一本通》
- 《实战前后端拆散 RBAC 权限管理系统》
- 《实战 SpringCloud 微服务从青铜到王者》
- 《VUE 深入浅出系列》