首页 > 其他分享 >map.merge(num, 1, Integer::sum); 和 map.put(num, map.getOrDefault(num, 0) + 1);的对比

map.merge(num, 1, Integer::sum); 和 map.put(num, map.getOrDefault(num, 0) + 1);的对比

时间:2025-01-17 21:09:55浏览次数:1  
标签:map sum merge num put getOrDefault

以下是对 map.merge(num, 1, Integer::sum);map.put(num, map.getOrDefault(num, 0) + 1); 的比较:

代码示例

以下是使用 map.merge(num, 1, Integer::sum); 的示例代码:

        for (int num : nums) {
            map.merge(num,1,Integer::sum);
        }

以下是使用 map.put(num, map.getOrDefault(num, 0) + 1); 的示例代码:

        for (int num : nums) {
            map.put(num,map.getOrDefault(num,0)+1);
        }

功能解释

  • map.merge(num, 1, Integer::sum);

    • num 键不存在时,直接将键值对 (num, 1) 插入到 map 中。
    • num 键已经存在时,使用 Integer::sum 方法将旧值和新值 1 相加,更新该键的值。
  • map.put(num, map.getOrDefault(num, 0) + 1);

    • 首先使用 map.getOrDefault(num, 0) 来获取 num 的值,如果 num 键不存在,则返回默认值 0
    • 然后将获取到的值加 1,并将结果作为 num 键的新值,使用 map.put 方法存储到 map 中。

区别

  • 简洁性

    • map.merge(num, 1, Integer::sum); 更简洁,使用了 merge 方法和 Integer::sum 方法引用,代码更清晰地表达了合并的意图。
    • map.put(num, map.getOrDefault(num, 0) + 1); 相对更冗长,需要先调用 getOrDefault 然后加 1 再调用 put 方法。
  • 原子性

    • map.merge 是一个原子操作,在多线程环境下,如果多个线程同时调用 merge 方法更新同一个键的值,不会出现并发问题。
    • map.put(num, map.getOrDefault(num, 0) + 1); 不是原子操作,在多线程环境下,可能会出现并发问题。例如,线程 A 调用 map.getOrDefault(num, 0) 得到旧值,在计算 map.getOrDefault(num, 0) + 1 的过程中,线程 B 可能修改了 num 的值,导致结果不一致。

性能考虑

  • map.merge(num, 1, Integer::sum);

    • 当键不存在时,性能开销稍大,因为需要调用 merge 方法并执行合并函数(尽管合并函数很简单)。
    • 当键存在时,性能取决于合并函数的复杂程度,对于 Integer::sum 这种简单函数,性能较好。
  • map.put(num, map.getOrDefault(num, 0) + 1);

    • 对于键不存在的情况,需要调用 getOrDefault 方法,性能稍逊于 merge 方法的直接添加操作。
    • 对于键存在的情况,性能与 merge 方法相当,但由于代码更分散,可能导致可读性稍差。

适用场景

  • map.merge(num, 1, Integer::sum);

    • 适用于需要合并操作且对代码简洁性和原子性有要求的场景,尤其是在并发环境中。
    • 适用于更复杂的合并操作,如合并两个集合、列表或自定义的合并逻辑,只需要修改合并函数即可。
  • map.put(num, map.getOrDefault(num, 0) + 1);

    • 适用于简单的更新计数或递增操作,当不考虑并发问题时,使用 put 方法也比较方便。

总的来说,map.merge(num, 1, Integer::sum); 更适合处理合并和更新操作,特别是在多线程环境下,而 map.put(num, map.getOrDefault(num, 0) + 1); 更适合简单的递增计数操作,在单线程环境中使用。

标签:map,sum,merge,num,put,getOrDefault
From: https://www.cnblogs.com/xinyangblog/p/18677672

相关文章

  • std::unorder_map知识点
    提示:文章文章目录前言一、背景二、std::unorder_map知识点3、优缺点以及适用处三、3.1总结前言前期疑问:本文目标:一、背景最近二、std::unorder_map知识点之前做的题目好像提到过unorder_map的底层实现。unorder_map和map的区别:看了文章,map的底层使用的......
  • 枚举类型(enum)的作用和用法
    简介枚举类型枚举类型(enum)是一种用户定义的数据类型,用于定义一组具有相关性的常量。枚举类型使代码更加可读和可维护,因为它为一组整型常量提供了有意义的名字。作用增强代码可读性:通过为一组相关的常量赋予有意义的名称,使代码更易于理解和维护。比如,定义一个表示颜色的枚举......
  • 【转】[JavaScript] 数组的 map 用法
    转自:kimi.aimap方法是数组的一个非常强大的方法,它用于创建一个新数组,新数组中的元素是调用一次提供的函数后的返回值。以下是其详细用法:基本语法JavaScript复制array.map(function(currentValue[,index[,array]]){//returnelementfornewarray,afterexecuting......
  • Bitmap的巧用
    题目关于用户标签的需求:用户标签包括用户的社会属性、生活习惯、消费行为等信息。例如,程序员,有驾照,单身等等。通过用户标签,可以对多样的用户群体进行统计。例如,统计用户的男女比例,统计喜欢旅游的用户数量等。通常的思路,是使用关系型数据库,比如Occupation表示用户职位,gender表示......
  • unordered_map-STL容器
    时间复杂度和空间复杂度......
  • HashMap 源码剖析 - put 流程
    HashMap源码剖析-put流程HashMap 是Java集合框架中的一个重要数据结构,用于存储键值对。它具有快速的查找、插入和删除性能。本文将深入剖析 HashMap 的 put 方法流程,帮助读者理解其内部实现原理。一、put 方法概述put 方法用于将指定的键值对插入到 HashMap 中,......
  • HashMap 源码剖析 - put 流程
    HashMap源码剖析-put流程HashMap 是Java集合框架中的一个重要数据结构,用于存储键值对。它具有快速的查找、插入和删除性能。本文将深入剖析 HashMap 的 put 方法流程,帮助读者理解其内部实现原理。一、put 方法概述put 方法用于将指定的键值对插入到 HashMap 中,......
  • Cyber Security 101-Offensive Security-SQLMap: The Basics(sqlmap基础)
    了解SQL注入并通过SQLMap工具利用此漏洞。任务1:介绍SQL 注入是一个普遍存在的漏洞,长期以来一直是热门网络安全主题。要了解这个漏洞,我们必须首先了解什么是数据库以及网站如何与数据库交互。数据库是可以存储、修改和检索。它将来自多个应用程序的数据存储在结构化......
  • 中考英语优秀范文-热点话题-传统文化-006 Welcome to Chinese Summer Camp 欢迎参加中
    1写作要求假定你是李华,你校今年暑假将为外国学生举办一场汉语夏令营活动(ChineseSummerCamp)。请你根据下面海报的内容,用英语给你的笔友David写一封电子邮件,介绍本次活动并邀请他参加。词数80左右。WelcometoChineseSummerCampTime:July18th—July28th,2024Place:No.8J......
  • 深挖 Java8的Stream.flatMap:你不知道的流式操作技巧
    flatMap()是Java8StreamAPI的核心方法之一,主要用于将嵌套结构展开并生成一个新的流。它的强大之处在于能够处理复杂数据结构并将其转换为简单的线性流。以下是flatMap()的常见用法和应用场景:1.将嵌套集合展开为单一流用法处理嵌套的List或Set,将其扁平化为单一流。......