次数统计 map.put(object, map.getOrDefault(object, 0) + 1); 详解

下面是对 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 在一组数据中出现的次数。
  • 逻辑
    1. 检查 object 是否已经在 Map 中:
      • 如果存在,则获取其当前次数(map.get(object))。
      • 如果不存在,则默认值为 0
    2. object 的计数加 1
    3. 将更新后的计数值重新存入 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}

工作流程

  1. 第一次循环:num = 1

    • map.getOrDefault(1, 0) 返回 01 不在 Map 中)。
    • 计算 0 + 1 = 1
    • 调用 map.put(1, 1),将键值对 1=1 放入 Map
  2. 第二次循环:num = 2

    • map.getOrDefault(2, 0) 返回 02 不在 Map 中)。
    • 计算 0 + 1 = 1
    • 调用 map.put(2, 1),将键值对 2=1 放入 Map
  3. 第三次循环:num = 2

    • map.getOrDefault(2, 0) 返回 12 已在 Map 中,对应值为 1)。
    • 计算 1 + 1 = 2
    • 调用 map.put(2, 2),更新键值对 2=2
  4. 依次类推,最终 Map 变为:{1=2, 2=2, 3=3}


4. 方法优点

  1. 简洁性

    • 使用 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);
    
  2. 提高代码可读性

    • 代码更紧凑,逻辑清晰,避免冗余的条件判断。
  3. 高效

    • getOrDefault 是单次操作,效率与直接调用 get 相同。
    • 使用 put 更新 Map 的时间复杂度为 O ( 1 ) O(1) O(1)(假设哈希冲突少)。

5. 注意事项

  1. 默认值逻辑

    • getOrDefault 不会改变 Map 的结构,即使返回了默认值,也不会将其存入 Map
    • 例如:
      Map<Integer, Integer> map = new HashMap<>();
      System.out.println(map.getOrDefault(1, 0)); // 输出 0
      System.out.println(map.containsKey(1));    // 输出 false
      
  2. 计数器类型

    • 如果是计数场景,建议使用封装类(如 Integer)作为值类型,因为泛型不支持基本数据类型。
  3. 线程安全

    • 如果在多线程环境中使用 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) 是一种高效简洁的方式,用于统计元素出现次数。
  • 它结合了 getOrDefaultput 方法,使代码更清晰,避免手动判断键是否存在。
  • 常用于数组、字符串、日志等场景中的频率统计。

通过这种方式,可以显著提升开发效率,同时保持代码的简洁性和可读性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

飞滕人生TYF

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值