首页 > 编程语言 >Java HashMap merge() 方法

Java HashMap merge() 方法

时间:2024-02-25 22:59:00浏览次数:29  
标签:old HashMap int value merge key Java null hash

3020. 子集中元素的最大数量【力扣周赛 382】用哈希表统计元素个数使用

点击查看代码
class Solution {
    public int maximumLength(int[] nums) {
        Map<Long, Integer> cnt = new HashMap<>();
        for (int x : nums) {
            cnt.merge((long) x, 1, Integer::sum);
        }
        // while true:
        Integer c1 = cnt.remove(1L);
        int ans = c1 != null ? c1 - 1 | 1 : 0;
        // 奇数-1为偶数,跟1取或后加1;偶数减1为奇数,或运算后不变(答案必须为奇数)
        for (long x : cnt.keySet()) {
            int res = 0;
            for (; cnt.getOrDefault(x, 0) > 1; x *= x) {
                res += 2;
            }
            res = res + (cnt.containsKey(x) ? 1 : -1);
            ans = Math.max(ans, res);
        }
        return ans;
    }
}

感谢灵神,灵神题解,还使用了keySet()方法

merge()

点击查看代码
        String k = "key";
        HashMap<String, Integer> map = new HashMap<String, Integer>() {{
            put(k, 1);
        }};
        map.merge(k, 2, (oldVal, newVal) -> oldVal + newVal);
等价于:
点击查看代码
        String k = "key";
        HashMap<String, Integer> map = new HashMap<String, Integer>() {{
            put(k, 1);
        }};
        Integer newVal = 2;
        if(map.containsKey(k)) {
            map.put(k, map.get(k) + newVal);
        } else {
            map.put(k, newVal);
        }

jdk8源码和注释

点击查看代码
 @Override
    public V merge(K key, V value,
                   BiFunction<? super V, ? super V, ? extends V> remappingFunction) {
        if (value == null)
            throw new NullPointerException();
        if (remappingFunction == null)
            throw new NullPointerException();
        int hash = hash(key);
        Node<K,V>[] tab; Node<K,V> first; int n, i;
        int binCount = 0;
        TreeNode<K,V> t = null;
        Node<K,V> old = null;
        // 该key原来的节点对象
        if (size > threshold || (tab = table) == null ||
          //第一个if,判断是否需要扩容
            (n = tab.length) == 0)
            n = (tab = resize()).length;
        if ((first = tab[i = (n - 1) & hash]) != null) {
            // 第二个if,取出old Node对象
            if (first instanceof TreeNode)
                old = (t = (TreeNode<K,V>)first).getTreeNode(hash, key);
            else {
                Node<K,V> e = first; K k;
                do {
                    if (e.hash == hash &&
                        ((k = e.key) == key || (key != null && key.equals(k)))) {
                        old = e;
                        break;
                    }
                    ++binCount;
                } while ((e = e.next) != null);
            }
        }
        if (old != null) {
          // 第三个if,如果 old Node 存在
            V v;
            if (old.value != null)
           // 如果old存在,算出新的val并写入old Node后返回。
                v = remappingFunction.apply(old.value, value);
            else
                v = value;
            if (v != null) {
                old.value = v;
                afterNodeAccess(old);
            }
            else
                removeNode(hash, key, null, false, true);
            return v;
        }
        if (value != null) {
           //如果old不存在且传入的newVal不为null,则put新的key
            if (t != null)
                t.putTreeVal(this, tab, hash, key, value);
            else {
                tab[i] = newNode(hash, key, value, first);
                if (binCount >= TREEIFY_THRESHOLD - 1)
                    treeifyBin(tab, hash);
            }
            ++modCount;
            ++size;
            afterNodeInsertion(true);
        }
        return value;
    }

感谢前辈https://www.jianshu.com/p/68e6b30410b0

标签:old,HashMap,int,value,merge,key,Java,null,hash
From: https://www.cnblogs.com/zuoyeb/p/18033272

相关文章

  • java中的基础方法使用
    何谓方法?◆System.out.printIn(),那么它是什么呢?◆Java方法是语句的集合,它们在一起执行一个功能。◆方法是解决一类问题的步骤的有序组合◆方法包含于类或对象中◆方法在程序中被创建,在其他地方被引用设计方法的原则:方法的本意是功能块,就是实现某个功能的语句块的集合。我......
  • Java基础12:JavaDoc生成文档
    JavaDoc1.javadoc命令是用来生成自己API文档的2.参数信息2.1@author作者名2.2@version版本号2.3@since指明需要最早使用的jdk版本2.4@param参数名2.5@return返回值情况2.6@throws异常抛出情况 ......
  • FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - JavaScript heap out of memo
    <---JSstacktrace--->====JSstacktrace=========================================Securitycontext:000000A526FA5891<JSObject>1:fromString(akafromString)[buffer.js:314][bytecode=0000010AE305A149offset=164](this=00000347695822D1&......
  • Java基础11:包机制
    1.包机制:1.1为了更好地组织类,Java提供了包机制,用于区别类名的命名空间1.2包语句的语法格式为:1.3一般利用公司域名倒置最为包名;1.4为了能够使用某一个包的成员,我们需要在Java程序中明确导入该包。使用`import`语句可以完成此功能 创建一个包......
  • Java的IO流
    夯实基础的第三篇:IO流1、流的概念流就是一连串的连续动态数据的集合,在Java的IO流中我们可以将其看做一个管道,将其包含输入输出流,Sourcet通过输入流将数据信息传给程序,而程序又通过输出流将数据信息传给目的地。就类似于我们从外部将东西传给程序就要输入流,我们从程序传给外部就......
  • DVWA-Javascript
    Javascript漏洞指的是通过某种方式绕过前端的javascript逻辑进行服务器访问。 --low级别:服务器端代码:提交token无效的结果如下:因为这里要求是在文本框中提交success内容,并且获取到最新token信息,才能提交成功。因此,先在文本框中输入success,然后再console控制台中,手动调用g......
  • Java学习笔记(1)
    常用DOS指令helloworld勾选文件扩展名创建.txt文件去掉.class后缀,运行java的执行原理组成跨平台使用IDEA创建项目之后直接编写代码使用Scanner接收输入数组静态初始化形式要注意数组的访问代码演示:publicclassMain{publicstaticvoidmain(......
  • Jakarta与javax的替换
    从JDK11开始,JavaSE平台开始逐步淘汰javax.*包,并逐渐将其替换为jakarta.*包。这是因为JavaEE从Oracle转移到了Eclipse基金会,并改名为JakartaEE,因此相关的API也相应地进行了迁移和重命名。这一变化对Java开发者的影响主要体现在以下几个方面:1.包名替换:在J......
  • Java基础07:基本运算符
    运算符1.Java语言支持如下运算符:1.1算术运算符:+,-,*,/,%,++,--1.2赋值运算符:=1.3关系运算符:>,<,>=,==,!=instanceof1.4逻辑运算符:&,|,^,~,>>,<<,>>>(了解)1.5条件运算符?:1.6扩展赋值运算:+=,-=,*=,/= ......
  • 全能代码生成器,自动生成前后端代码、生成项目框架、生成JavaBean、生成数据库文档、自
    TableGo_20240224v8.4.0正式版发布,此次版本累计更新如下: 1、TableGo专属LOGO上线 2、生成数据库文档ER图新增备注+字段名的生成配置 3、生成自定义文件功能新增临时参数配置,用于使用临时数据生成自定义文件 4、新增基于Excel数据生成自定义文件,可导入Excel数据生成程序代码......