下面是对 map.put(object, map.getOrDefault(object, 0) + 1)
的详解,它通常用于在 Java 中对元素出现的次数进行统计,是一种简洁而高效的实现方法。
1. 方法简介
方法解析
-
map.put(key, value)
:- 在
Map
中插入一个键值对。 - 如果
key
已存在,则覆盖原有的值;如果key
不存在,则新增该键值对。
- 在
-
map.getOrDefault(key, defaultValue)
:- 从
Map
中获取指定key
的值。 - 如果
key
存在,则返回对应的值; - 如果
key
不存在,则返回defaultValue
(不会将defaultValue
放入Map
中)。
- 从
2. 核心代码逻辑
代码作用
map.put(object, map.getOrDefault(object, 0) + 1);
- 目标:统计
object
在一组数据中出现的次数。 - 逻辑:
- 检查
object
是否已经在Map
中:- 如果存在,则获取其当前次数(
map.get(object)
)。 - 如果不存在,则默认值为
0
。
- 如果存在,则获取其当前次数(
- 对
object
的计数加1
。 - 将更新后的计数值重新存入
Map
。
- 检查
3. 工作过程详解
代码示例
假设我们统计一个数组中每个数字出现的次数:
int[] nums = {1, 2, 2, 3, 1, 3, 3};
Map<Integer, Integer> map = new HashMap<>();
for (int num : nums) {
map.put(num, map.getOrDefault(num, 0) + 1);
}
// 输出结果
System.out.println(map); // {1=2, 2=2, 3=3}
工作流程
-
第一次循环:
num = 1
map.getOrDefault(1, 0)
返回0
(1
不在Map
中)。- 计算
0 + 1 = 1
。 - 调用
map.put(1, 1)
,将键值对1=1
放入Map
。
-
第二次循环:
num = 2
map.getOrDefault(2, 0)
返回0
(2
不在Map
中)。- 计算
0 + 1 = 1
。 - 调用
map.put(2, 1)
,将键值对2=1
放入Map
。
-
第三次循环:
num = 2
map.getOrDefault(2, 0)
返回1
(2
已在Map
中,对应值为1
)。- 计算
1 + 1 = 2
。 - 调用
map.put(2, 2)
,更新键值对2=2
。
-
依次类推,最终
Map
变为:{1=2, 2=2, 3=3}
。
4. 方法优点
-
简洁性:
- 使用
getOrDefault
简化了对Map
中是否存在key
的判断逻辑。 - 无需显式使用
if-else
检查key
是否存在。
传统写法:
if (map.containsKey(object)) { map.put(object, map.get(object) + 1); } else { map.put(object, 1); }
优化后:
map.put(object, map.getOrDefault(object, 0) + 1);
- 使用
-
提高代码可读性:
- 代码更紧凑,逻辑清晰,避免冗余的条件判断。
-
高效:
getOrDefault
是单次操作,效率与直接调用get
相同。- 使用
put
更新Map
的时间复杂度为 O ( 1 ) O(1) O(1)(假设哈希冲突少)。
5. 注意事项
-
默认值逻辑:
getOrDefault
不会改变Map
的结构,即使返回了默认值,也不会将其存入Map
。- 例如:
Map<Integer, Integer> map = new HashMap<>(); System.out.println(map.getOrDefault(1, 0)); // 输出 0 System.out.println(map.containsKey(1)); // 输出 false
-
计数器类型:
- 如果是计数场景,建议使用封装类(如
Integer
)作为值类型,因为泛型不支持基本数据类型。
- 如果是计数场景,建议使用封装类(如
-
线程安全:
- 如果在多线程环境中使用
Map
,需要用线程安全的ConcurrentHashMap
或对Map
进行同步处理。 - 否则可能会导致数据不一致的问题。
- 如果在多线程环境中使用
6. 常见应用场景
(1) 数组中元素出现次数统计
int[] nums = {1, 2, 2, 3, 1, 3, 3};
Map<Integer, Integer> map = new HashMap<>();
for (int num : nums) {
map.put(num, map.getOrDefault(num, 0) + 1);
}
System.out.println(map); // {1=2, 2=2, 3=3}
(2) 字符串中字符频率统计
String str = "hello world";
Map<Character, Integer> map = new HashMap<>();
for (char ch : str.toCharArray()) {
map.put(ch, map.getOrDefault(ch, 0) + 1);
}
System.out.println(map); // { =1, r=1, d=1, e=1, h=1, l=3, o=2, w=1}
(3) 日志或事件统计
String[] events = {"login", "click", "login", "logout", "click"};
Map<String, Integer> eventCount = new HashMap<>();
for (String event : events) {
eventCount.put(event, eventCount.getOrDefault(event, 0) + 1);
}
System.out.println(eventCount); // {login=2, click=2, logout=1}
7. 总结
map.put(object, map.getOrDefault(object, 0) + 1)
是一种高效简洁的方式,用于统计元素出现次数。- 它结合了
getOrDefault
和put
方法,使代码更清晰,避免手动判断键是否存在。 - 常用于数组、字符串、日志等场景中的频率统计。
通过这种方式,可以显著提升开发效率,同时保持代码的简洁性和可读性。