首页 > 其他分享 >判断两个Map集合是否相等

判断两个Map集合是否相等

时间:2022-12-16 16:24:20浏览次数:52  
标签:Map 相等 return map MapUtils map2 集合 null

原文链接: 判断两个Map集合是否相等

较原文修改了一个map为null时的空指针bug

用途

判断数据是否有差异

代码

import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections.MapUtils;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.atomic.AtomicReference;
@Slf4j
public class MapCompareTest {

    /**
     * 判断两个Map是否相等
     *
     * @param map  map1
     * @param map2 Map2
     * @return true:相等
     */
    public static Boolean mapCompare(Map<String, Object> map, Map<String, Object> map2) {
        try {
            //先对比map是否为null,为空,长度
            if (MapUtils.isEmpty(map) && MapUtils.isEmpty(map2)) {
                return true;
            }
            boolean mapIsNull = MapUtils.isEmpty(map) && MapUtils.isNotEmpty(map2);
            boolean mapIsNotNull = MapUtils.isNotEmpty(map) && MapUtils.isEmpty(map2);
            if (mapIsNull || mapIsNotNull) {
                return false;
            }
            if (map.size() != map2.size()) {
                return false;
            }

            AtomicReference<Boolean> flg = new AtomicReference<>(true);

            //再逐个对比每个字段的值
            map.forEach((k, v) -> {
                // 判断key为空的情况
                if (k == null && !map2.containsKey(null)) {
                    flg.set(false);
                }
                if (v == null || map2.get(k) == null) {
                    boolean b = v == null && map2.get(k) != null;
                    boolean b1 = v != null && map2.get(k) == null;
                    if (b || b1) {
                        flg.set(false);
                    }
                }
                //如果不忽略字段类型,则使用 else if (!v.equals(map2.get(k))) {
                //先转为字符串,防止类型不匹配
                else if (!v.toString().equals(map2.get(k).toString())) {
                    flg.set(false);
                }
            });
            return flg.get();
        } catch (Exception e) {
            log.warn("Map元素比对异常:{}", e.getMessage());
            return false;
        }
    }

    public static void main(String[] args) {
        Map<String, Object> map = new HashMap<>();
        Map<String, Object> map1 = new HashMap<>();

        map.put("a", null);
        map.put("ab", 2.342);

        map1.put("a", null);
        map1.put("ab", "2.342");

        System.out.println(mapCompare(map, map1));
        // true
    }
}

修改

image-20221216160735507

标签:Map,相等,return,map,MapUtils,map2,集合,null
From: https://www.cnblogs.com/lyn8100/p/16987659.html

相关文章

  • 集合转数组 toArray
    使用集合转数组的方法,必须使用集合的toArray(T[]array),传入的是类型完全一致、长度为0的空数组。反例:直接使用toArray无参方法存在问题,此方法返回值只能是Object[]......
  • 【221216ph-1】一把钢尺在20℃时是准确的,如果0℃时用它测量物体的长度,则测量的长度数
    ......
  • 万字长文深入理解java中的集合-附PDF下载
    目录​​1.前言​​​2.List​​2.1fail-safefail-fast知多少​​​2.1.1Fail-fastIterator​​​​2.1.2Fail-fast的原理​​​​2.1.3Fail-safeIterator​​​......
  • js中map的实现
    JS中map的实现思路分析map是所有数组都可以用的方法,因此我们可以将方法挂在到Array.prototype上去之后所有的数组都可以访问到这个方法map函数,接收一个函数当作参数,并......
  • python 操作redis有序集合
      https://feeler.blog.csdn.net/article/details/103100452?spm=1001.2101.3001.6650.1&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogComme......
  • java集合类——Stack栈类与Queue队列
      今日走读代码时,遇到stack栈类,特查看java的API文档,总结如下:Stack继承Vector类,它通过五个操作对类Vector进行了扩展。栈是后进先出的。栈提供了通常的push和pop......
  • MapReduce
    实验干嘛实现一个分布式的MapReduce,由两部分组成,master和worker。一个master,多个worker。在本机运行,worker和master用rpc通信。每个worker向master索要任务......
  • 计算机中的数学【集合论】现代数学的共同基础
    数学如何一步步从初级向高级发展,更高级别的数学对于具体应用究竟有何好处?集合论:现代数学的共同基础现代数学有数不清的分支,但是,它们都有一个共同的基础——集合论——因为......
  • ConcurrentLinkedQueue和ConcurrentHashMap简单介绍
    ConcurrentLinkedQueue是一个单向的链表 入队列     每次在队尾追加两个节点,才移动一次tail节点添加节点1和节点2  在添加一个节点3  step4中q为......
  • 保证集合的线程安全问题
    确保集合的线程安全。在开启多线程操作集合的时候,很容易对集合进行增删改查,这样子,集合的访问情况就会变化。AutoResetEvent:reset()方法.将线程设置为非终止状态,导致线程阻......