`

原来常用的集合类都实现了equals方法

    博客分类:
  • java
阅读更多

   今天网上有人问怎么比较两个map是否相等,有人说直接可以equals,以前没注意,直接查了查还真的可以,发现不仅map,常用的list、set都实现了自己的equals,都怪自己没学好基础啊吐舌头,看代码,先新建空的集合

import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;

public class ArrayTest {

	public static void main(String[] args) {
		
        HashMap map1 = new HashMap<>();
        HashMap map2 = new HashMap<>();
        List list1 = new ArrayList<>();
        List list2 = new ArrayList<>();
        HashSet set1 = new HashSet<>();
        HashSet set2 = new HashSet<>();
        System.out.println("判断两个新建的map是否相等..."+map1.equals(map2));
        System.out.println("判断两个新建的list是否相等..."+list1.equals(list2));
        System.out.println("判断两个新建的set是否相等..."+set1.equals(set2));
	}

}

   打印结果:

   判断两个新建的map是否相等...true

   判断两个新建的list是否相等...true

   判断两个新建的set是否相等...true

  ——————————————————————————————————————————————

   修改下代码可以在map 、list、set里加些数据

   

import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;

public class ArrayTest {

	
	@SuppressWarnings({ "rawtypes", "unchecked" })
	public static void main(String[] args) {
		
        HashMap map1 = new HashMap<>();
        HashMap map2 = new HashMap<>();
        //给两个map对象加入同样的key和同样的value
        map1.put("one", 1);
        map1.put("two", 2);
        map1.put("three", 3);
        map2.put("one", 1);
        map2.put("three", 3);
        map2.put("two", 2);
        
        List list1 = new ArrayList<>();
        List list2 = new ArrayList<>();
        //给两个list对象加入同样的值
        list1.add(1);
        list1.add(2);
        list1.add(3);
        
        list2.add(1);
        list2.add(2);
        list2.add(3);
        
        HashSet set1 = new HashSet<>();
        HashSet set2 = new HashSet<>();
        //给两个set对象加入同样的值
       
        set1.add("one");
        set1.add("two");
        set1.add("three");
        set1.add(3);
        set2.add("two");
        set2.add("three");
        set2.add(3);
        set2.add("one");
       
        System.out.println("判断两个新建的map是否相等..."+map1.equals(map2));
        System.out.println("判断两个新建的list是否相等..."+list1.equals(list2));
        System.out.println("判断两个新建的set是否相等..."+set1.equals(set2));
	}

 运行结果:

判断两个新建的map是否相等...true

判断两个新建的list是否相等...true

判断两个新建的set是否相等...true。

大家发现map和set插入值时顺序不同,但结果仍是true,而list如果插入顺序不同最后比较会是false(代码就不贴了,大家可以自己试下)。大家知道HashMap和HashSet两个是无序的,不管插入时顺序是什么样,list集合是有序的,和插入时顺序一样。所以在equals方法时,set、map和list,jdk实现也是不同的(哈哈,废话啊)。顺便贴出HashMap、HashSet和ArrayList实现equals的jdk源码,很好理解的

HashMap的父类AbstractMap实现的equals源码

public boolean equals(Object o) {
        if (o == this)
            return true;

        if (!(o instanceof Map))
            return false;
        Map<K,V> m = (Map<K,V>) o;
        if (m.size() != size())
            return false;

        try {
            Iterator<Entry<K,V>> i = entrySet().iterator();
            while (i.hasNext()) {
                Entry<K,V> e = i.next();
                K key = e.getKey();
                V value = e.getValue();
                if (value == null) {
                    if (!(m.get(key)==null && m.containsKey(key)))
                        return false;
                } else {
                    if (!value.equals(m.get(key)))
                        return false;
                }
            }
        } catch (ClassCastException unused) {
            return false;
        } catch (NullPointerException unused) {
            return false;
        }

        return true;
    }

  HashSet的父类AbstractSet实现的equals源码 

 

 

 public boolean equals(Object o) {
        if (o == this)
            return true;

        if (!(o instanceof Set))
            return false;
        Collection c = (Collection) o;
        if (c.size() != size())
            return false;
        try {
            return containsAll(c);
        } catch (ClassCastException unused)   {
            return false;
        } catch (NullPointerException unused) {
            return false;
        }
    }

 ArrayList的父类AbstractList实现的equals源码

  

  public boolean equals(Object o) {
        if (o == this)
            return true;
        if (!(o instanceof List))
            return false;

        ListIterator<E> e1 = listIterator();
        ListIterator e2 = ((List) o).listIterator();
        while (e1.hasNext() && e2.hasNext()) {
            E o1 = e1.next();
            Object o2 = e2.next();
            if (!(o1==null ? o2==null : o1.equals(o2)))
                return false;
        }
        return !(e1.hasNext() || e2.hasNext());
    }

 

   

 

分享到:
评论

相关推荐

    常用类的方法集合

    ### 常用类的方法集合 #### String 类 **String 类** 在 Java 语言中扮演着极其重要的角色,它是不可变的对象(immutable object),这意味着一旦一个 `String` 对象被创建,它的值就不能被更改。这特性使得 `...

    java中常用集合类和接口.doc

    ### Java中常用集合类和接口详解 #### 一、引言 在Java编程中,集合类(Collections)是非常重要的组成部分,它们提供了灵活的数据管理和组织方式。本文将详细介绍Java中的主要集合类及其接口,帮助读者更好地理解...

    java常用集合类总结

    Java中的集合类是编程中不可或缺的部分,它们提供了一种组织和管理对象的方式。在这个总结中,我们将深入探讨Java集合框架中的主要组件,包括ArrayList、LinkedList、HashSet、HashMap等,并了解如何进行基本操作如...

    2JAVA编程高级-集合类.pdf

    以上是对Java编程中集合类的相关知识点进行了详细的介绍,包括了集合类的概念、分类、常用接口及其实现类、异常处理以及泛型的使用等重要内容。掌握这些知识点对于深入理解和使用Java集合框架至关重要。

    Java常用类及集合操作

    ### Java常用类及集合操作详解 #### 一、Java常用类概述 在Java编程语言中,内置了许多实用的类,这些类提供了丰富的功能,能够帮助开发者高效地完成各种任务。本节将详细介绍其中的一些关键类及其用法。 ##### ...

    Java容器集合(equals 和 hashCode+基础数据结构+ArrayList+Vector和LinkedList)

    在Object类中,equals方法的默认实现是使用“==”比较两个对象的内存地址,而不是比较两个对象的内容。因此,在大多数情况下,我们需要重写equals方法,以便比较两个对象的内容是否相等。 重写equals方法需要遵守...

    对于java集合类的一个简单介绍

    List接口是Java集合类中最基本的接口,提供了基本的添加、删除、获取元素的方法。ArrayList和LinkedList是List接口的两个常用的实现类。ArrayList是一个动态数组,实现了List接口,提供了快速的随机访问和插入元素的...

    C#基础类 常用类 常用方法源码 .NET 工具类 源码

    这个压缩包“C#基础类 常用类 常用方法源码 .NET 工具类 源码”包含了C#编程中的基础类和常用工具类的源代码,对于学习和理解C#的编程实践非常有帮助。下面,我们将详细探讨这些关键知识点。 1. **基础类**:在C#中...

    数据结构—集合运算实现 实现报告(含代码)

    数据结构—集合运算实现 实现报告(含代码) 在计算机科学中,数据结构是组织、存储和...通过实际操作,学习者可以深化对单链表的理解,并掌握集合运算的实现方法,这对于理解和开发更复杂的数据结构和算法至关重要。

    java集合类

    - 所有集合类的元素都是Object类型的引用,这意味着它们可以存储任何类型的对象,但这也导致需要进行类型转换(造型)。 2. **新集合类体系** - 自Java 1.2起,Java引入了一个庞大的集合框架,包括Collection、...

    hashcode()和equals()

    这两个方法来源于 `Object` 类,是所有Java类的基类,因此,每个自定义类如果不重写它们,将会继承 `Object` 类的默认实现。 `hashCode()` 方法返回一个整数值,代表当前对象的哈希码,通常用于哈希表中快速定位...

    C# 有关List&lt;T&gt;的Contains与Equals方法.doc

    在C#编程中,`List&lt;T&gt;` 是一个常用的泛型集合类,用于存储同类型的元素。这个类提供了许多方便的方法,如添加、删除、查找等。本文主要关注 `List&lt;T&gt;` 的两个关键方法:`Contains()` 和 `Equals()`,以及它们在处理...

    Java集合类总结

    这些集合类被定义在`java.util`包中,为开发者提供了灵活的数据结构来实现各种应用程序的需求。由于集合类数量众多且功能各异,初学者可能会感到困惑。本篇文章旨在对Java集合类进行系统的总结,帮助读者更好地理解...

    Java集合排序及java集合类详解(Collection、List、Map、Set

    `Collection`是Java集合框架的根接口,所有具体集合类都是它的子类。`Collection`提供了一组通用的方法来处理元素集合。 #### 1.2.1 常用方法 - `add(E e)`:向集合中添加一个元素。 - `remove(Object o)`:从集合...

    Java集合排序及java集合类详解.pdf

    本文将深入探讨Java集合框架中的主要组件:Collection、List、Set和Map,以及它们的特点、常用方法和实现原理。 1. **集合框架概述** - **容器简介**:在Java中,集合框架是一种容器,用于存储一组对象。这些容器...

    Java常用类源码

    2. `ArrayList` 和 `LinkedList` 类:这两个类都是`List`接口的实现,用于存储有序的元素集合。`ArrayList`基于动态数组,适用于随机访问,而`LinkedList`基于双向链表,适合于频繁插入和删除。通过源码分析,我们...

    (完整版)Java常用类习题.doc

    * 集合框架提供了许多种集合类,例如ArrayList、LinkedList、HashSet等 知识点八:String类的getChars()方法 * getChars()方法用于将字符串的一部分转换为字符数组 * getChars()方法的参数包括开始索引、结束索引...

    C#常用类总结

    每个类都直接或间接地继承自它,包含了一些基本的方法,如`ToString()`、`Equals()`和`GetHashCode()`,这些方法用于对象的表示、比较和哈希计算。 接下来是`System.String`类,它代表不可变的字符序列。字符串在C#...

    Java集合排序及java集合类详解(Collection、List、Map、Set).pdf

    - **常用方法**:Collection接口是所有集合的父接口,提供了add、remove、clear等基本操作方法。 - **迭代器**:Collection的迭代器(Iterator)是遍历集合元素的主要方式,它支持next()和hasNext()方法来访问和...

Global site tag (gtag.js) - Google Analytics