Java比较集合是否相等的技巧分享

 更新时间:2025年06月25日 09:36:32   作者:竹子爱揍功夫熊猫  
集合使我们开发过程中非常用到的,要说最常用的,非List莫属,那么当我们想要比较两个List是否相等的时候,应该怎么处理呢?本文将介绍几个小技巧来处理,需要的朋友可以参考下

一、集合相等的定义

说两个东西是否相等,首先要弄清楚这里相等是什么意思,值相等,内存地址相等还是别的什么相等。

1.1 集合相等的基本概念

  • 集合大小相同
  • 集合中的元素相同
  • 元素的顺序(对于有序集合)和重复性(对于允许重复的集合)是否一致

1.2 不同集合类型的相等性特点

  • List:有序,允许重复
  • Set:无序,不允许重复
  • Map:键值对存储,键唯一

二、Java中比较集合相等的快速方法

Java本身是提供了相等比较的方法的,这里来看看都有哪些。

2.1 使用equals()方法

equals()方法在集合类中的实现原理是都有自己的特点的,我们下面综合实际案例一起看看:

  • 对于List,比较元素顺序和内容
import java.util.ArrayList;
import java.util.List;

public class ArrayListComparison {

    public static void main(String[] args) {
        // 创建第一个ArrayList
        List<String> list1 = new ArrayList<>();
        list1.add("Apple");
        list1.add("Banana");
        list1.add("Cherry");

        // 创建第二个ArrayList
        List<String> list2 = new ArrayList<>();
        list2.add("Apple");
        list2.add("Banana");
        list2.add("Cherry");

        // 创建第三个ArrayList(用于测试不相等的情况)
        List<String> list3 = new ArrayList<>();
        list3.add("Apple");
        list3.add("Cherry");
        list3.add("Banana");

        // 比较list1和list2是否相等
        boolean isEqual1 = list1.equals(list2);
        System.out.println("list1和list2是否相等: " + isEqual1);

        // 比较list1和list3是否相等
        boolean isEqual2 = list1.equals(list3);
        System.out.println("list1和list3是否相等: " + isEqual2);
    }
    
}

在这里插入图片描述

上面的执行结果可以很明显的看出,即使元素内容一样,顺序不一样,他们的结果也是不同的。

  • 对于Set,比较元素内容,忽略顺序
import java.util.HashSet;
import java.util.Set;

public class HashSetComparison {
    public static void main(String[] args) {
        // 创建两个HashSet对象
        Set<Integer> set1 = new HashSet<>();
        Set<Integer> set2 = new HashSet<>();
        Set<Integer> set3 = new HashSet<>();

        // 添加元素到set1
        set1.add(1);
        set1.add(2);
        set1.add(3);

        // 添加元素到set2,顺序不同
        set2.add(3);
        set2.add(1);
        set2.add(2);

        // 添加元素到set3,顺序不同
        set3.add(3);
        set3.add(1);
        set3.add(2);
        set3.add(4);

        // 输出结果
        System.out.println("set1和set2是否相等: " + set1.equals(set2));
        System.out.println("set2和set3是否相等: " + set2.equals(set3));
    }

}

在这里插入图片描述

上面执行的结果不难看出,set集合,只在乎元素是否相同,不在乎里面的顺序。

  • 对于Map,比较键值对
import java.util.HashMap;
import java.util.Map;

public class HashMapComparison {
    public static void main(String[] args) {
        // 创建两个HashMap对象
        Map<String, Integer> map1 = new HashMap<>();
        Map<String, Integer> map2 = new HashMap<>();
        Map<String, Integer> map3 = new HashMap<>();

        // 添加键值对到map1
        map1.put("apple", 1);
        map1.put("banana", 2);
        map1.put("cherry", 3);

        // 添加键值对到map2,顺序不同
        map2.put("apple", 1);
        map2.put("cherry", 3);
        map2.put("banana", 2);

        // 添加键值对到map3,值不同
        map3.put("banana", 3);
        map3.put("apple", 3);
        map3.put("cherry", 3);

        // 输出结果
        System.out.println("map1和map2是否相等: " + map1.equals(map2));
        System.out.println("map2和map3是否相等: " + map3.equals(map2));
    }

}

在这里插入图片描述

从上面的执行结果可以看出,Map比较的是键值对是否一致,也是和顺序无关的。

值得注意的是,Map本身建议使用entrySet()方法再进行equals方法。

在这里插入图片描述

三、值得推荐的写法和三方库

实际有很多第三方库都实现了集合的比较,例如Apache Commons Collections(这个有的版本List比较是不区分顺序的,实际操作要注意)、Google Guava、和Hutool

使用这些三方库可以有效的提高代码的可读性,并且使用起来都比较简洁,传说有的三方库还有一些性能提升(这个我没验证过)。

3.1 推荐使用库 Hutool

Hutool是一个国产的Java工具包,提供了丰富的集合操作功能,同时还包含文件操作、加密解密、日志等其他实用工具。它简化了集合的比较和操作,例如合并、交集、差集等。

  • 依赖引入
<dependency>
    <groupId>cn.hutool</groupId>
    <artifactId>hutool-all</artifactId>
    <version>5.7.11</version>
</dependency>
  • 示例代码
import cn.hutool.core.collection.CollUtil;

import java.util.ArrayList;
import java.util.List;

public class HutoolExample {

    public static void main(String[] args) {
        List<String> list1 = new ArrayList<>();
        list1.add("Apple");
        list1.add("Banana");
        list1.add("Cherry");

        List<String> list2 = new ArrayList<>();
        list2.add("Apple");
        list2.add("Banana");
        list2.add("Cherry");

        // 比较两个集合是否相等
        boolean isEqual = CollUtil.equals(list1, list2);
        System.out.println("list1和list2是否相等: " + isEqual); // 输出 true
    }
    
}

3.2 不用三方库的推荐写法 Objects.equals

java.util.Objects.equals 是 Java 标准库中的一个实用工具方法,用于比较两个对象是否相等。它在 Java 7 中引入,旨在简化对象比较的代码,同时避免空指针异常(NullPointerException)。这个方法非常实用,尤其是在处理可能为 null 的对象时。

  • 使用案例:
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Objects;

public class ObjectsComparison {

    public static void main(String[] args) {
        ArrayList<String> list1 = new ArrayList<>(Arrays.asList("Apple", "Banana", "Cherry"));
        ArrayList<String> list2 = new ArrayList<>(Arrays.asList("Apple", "Banana", "Cherry"));
        ArrayList<String> list3 = new ArrayList<>(Arrays.asList("Apple", "Cherry", "Banana"));

        boolean isEqual1 = Objects.equals(list1, list2);
        boolean isEqual2 = Objects.equals(list1, list3);

        System.out.println("list1和list2是否相等: " + isEqual1); // true
        System.out.println("list1和list3是否相等: " + isEqual2); // false
    }

}
  • 执行结果:

在这里插入图片描述

3.2.1 实现原理

Objects.equals 的实现逻辑非常简单,以下是它的源码:

在这里插入图片描述

  • 如果两个对象引用相同(a == b),直接返回 true
  • 如果第一个对象不为 null,调用 a.equals(b) 方法进行比较。
  • 如果两个对象都为 null,返回 true

四、总结

不管是什么职级的开发工程师,在Java开发中,你都会使用到集合,集合比较是否相等是一个比较常见的方法,要弄清楚这个集合比较的基本规则,你才能更好的去实现需求。

以上就是Java比较集合是否相等的技巧分享的详细内容,更多关于Java比较集合相等的资料请关注脚本之家其它相关文章!

相关文章

  • Java 格式化输出JSON字符串的2种实现操作

    Java 格式化输出JSON字符串的2种实现操作

    这篇文章主要介绍了Java 格式化输出JSON字符串的2种实现操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-10-10
  • spring无法引入注解及import org.springframework.web.bind.annotation.*报错的解决

    spring无法引入注解及import org.springframework.web.bind.annota

    本文主要介绍了spring无法引入注解及import org.springframework.web.bind.annotation.*报错的解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-06-06
  • java数据库开发之JDBC的完整封装兼容多种数据库

    java数据库开发之JDBC的完整封装兼容多种数据库

    这篇文章主要介绍了java数据库开发之JDBC的完整封装兼容多种数据库,需要的朋友可以参考下
    2020-02-02
  • 实现Java删除一个集合的多个元素

    实现Java删除一个集合的多个元素

    Java中的For each实际上使用的是iterator进行处理的。而iterator是不允许集合在iterator使用期间删除的。而我在for each时,从集合中删除了一个元素,这导致了iterator抛出了ConcurrentModificationException,下面来看看到底怎么回事。
    2016-08-08
  • SimpleDateFormat在多线程下的安全问题及解决

    SimpleDateFormat在多线程下的安全问题及解决

    SimpleDateFormat类在Java中用于日期时间的格式化和解析,但在高并发环境下存在线程不安全的问题,原因是它共享了一个Calendar对象,导致多个线程操作时出现冲突,为了解决这个问题,可以使用局部变量、加锁或使用线程安全的DateTimeFormatter类
    2026-03-03
  • Java多线程Thread基础学习

    Java多线程Thread基础学习

    每一个正在执行的程序都是一个进程,资源只有一块,所以在同一时间段会有多个程序同时执行,但是在一个时间点上,只能由一个程序执行,多线程是在一个进程的基础之上的进一步划分,需要的朋友可以参考下
    2023-04-04
  • Java的覆写操作实例分析

    Java的覆写操作实例分析

    这篇文章主要介绍了Java的覆写操作,结合实例形式分析了java属性覆写及super调用父类方法覆写相关操作技巧,需要的朋友可以参考下
    2019-10-10
  • 详解Java多态对象的类型转换与动态绑定

    详解Java多态对象的类型转换与动态绑定

    这篇文章主要介绍了详解Java多态对象的类型转换与动态绑定,是Java入门学习中的基础知识,需要的朋友可以参考下
    2015-09-09
  • jvm运行原理以及类加载器实例详解

    jvm运行原理以及类加载器实例详解

    这篇文章主要给大家介绍了关于jvm运行原理以及类加载器的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-05-05
  • 使用feign调用接口时调不到get方法的问题及解决

    使用feign调用接口时调不到get方法的问题及解决

    这篇文章主要介绍了使用feign调用接口时调不到get方法的问题及解决,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-03-03

最新评论