`

原来常用的集合类都实现了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());
    }

 

   

 

分享到:
评论

相关推荐

    java常用工具类的使用

    而Date的其他构造方法和普通方法的API都不容易实现国际化,因此目前Date类的大多数方法都被标识为过时,表示更灵活的时间类请参考java.util.Calendar。 Date的输出结果是按照国际通用格式输出的,而中国更习惯于...

    廖雪峰 Java 教程.doc

    常用工具类 异常处理 Java的异常 捕获异常 抛出异常 自定义异常 使用断言 使用JDK Logging 使用Commons Logging 使用Log4j 使用SLF4J和Logback 反射 Class类 访问字段 调用方法 调用构造方法 获取...

    超级有影响力霸气的Java面试题大全文档

    Collections是针对集合类的一个帮助类,他提供一系列静态方法实现对各种集合的搜索、排序、线程安全化等操作。 13、&和&&的区别。 &是位运算符,表示按位与运算,&&是逻辑运算符,表示逻辑与(and)。 14、...

    java2022面试宝典

    一.JDK、JRE、JVM之间的区别 JDK(Java SE Development Ki),Java标准开发包,它提供了编译、运行Jlva程序所需的各种工具和资源,包括Java编译...比如: 在Java的一些集合类的实现中,在比较两个对象是否相等时,会根据上

    java 面试题 总结

    Collections是针对集合类的一个帮助类,他提供一系列静态方法实现对各种集合的搜索、排序、线程安全化等操作。 10、&和&&的区别。 &是位运算符,表示按位与运算,&&是逻辑运算符,表示逻辑与(and)。 11、HashMap...

    AIC的Java课程1-6章

     学习ArrayList与LinkedList类,理解封装数组和链表两种方式定义集合类。  可以使用迭代器Iterator遍历集合的元素。  [*]理解泛型概念,声明和使用带有范型的集合。 第11章 集合 4...

    C#全能速查宝典

    《C#全能速查宝典》共分为8章,分别介绍了C#语言基础、Windows窗体及常用控件、Windows高级控件、控件公共属性、方法及事件、数据库开发、文件、数据流与...,共包含562个C#编程中常用的属性、方法、类和各种技术...

    javaSE代码实例

    13.3.2 编写方法链以及StringBuffer类的重要方法 255 13.4 StringBuilder类 258 13.5 正则表达式 259 13.5.1 正则表达式的基本语法 259 13.5.2 Pattern类简介 262 13.5.3 Matcher类简介 263 13.5.4 ...

    疯狂JAVA讲义

    学生提问:为什么静态内部类实例方法也不能访问外部类的实例属性呢? 207 学生提问:接口里是否能定义内部接口? 208 6.7.3 使用内部类 208 学生提问:既然内部类是外部类的成员,是否可以为外部类定义子类,在...

    java面试宝典2012版.pdf

    68、你所知道的集合类都有哪些?主要方法? 69、两个对象值相同(x.equals(y) == true),但却可有不同的hash code,这句话对不对? 70、TreeSet里面放对象,如果同时放入了父类和子类的实例对象,那比较时使用的是...

    java基础题 很全面

    41. 你所知道的集合类都有哪些?主要方法? 12 42. 描述一下JVM加载class文件的原理机制? 12 43. char型变量中能不能存贮一个中文汉字?为什么? 12 44. 多线程有几种实现方法,都是什么?同步有几种实现方法,都是什么? 12...

    千方百计笔试题大全

    70、多线程有几种实现方法,都是什么?同步有几种实现方法,都是什么? 17 71、启动一个线程是用run()还是start()? 17 72、当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它方法? 18 73...

    java面试宝典

    70、多线程有几种实现方法,都是什么?同步有几种实现方法,都是什么? 17 71、启动一个线程是用run()还是start()? 17 72、当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它方法? 18 73...

    net学习笔记及其他代码应用

    10.求以下表达式的值,写出您想到的一种或几种实现方法: 1-2+3-4+……+m [Page] 答: int Num = this.TextBox1.Text.ToString() ; int Sum = 0 ; for (int i = 0 ; i ; i++) { if((i%2) == 1) { Sum += i ; ...

    JAVA入门1.2.3:一个老鸟的JAVA学习心得 PART1(共3个)

    10.2.3 记得给类一个无参数的构造方法 255 10.2.4 调用父类中的构造方法 256 10.2.5 对象也会“变脸” 258 10.2.6 遵守语法,正确“变脸” 262 10.3 覆盖——与继承如影随形 264 10.3.1 当方法不再通用 264 ...

    Java入门1·2·3:一个老鸟的Java学习心得.PART3(共3个)

    10.2.3 记得给类一个无参数的构造方法 255 10.2.4 调用父类中的构造方法 256 10.2.5 对象也会“变脸” 258 10.2.6 遵守语法,正确“变脸” 262 10.3 覆盖——与继承如影随形 264 10.3.1 当方法不再通用 264 ...

    JAVA基础课程讲义

    String类的常用方法(已讲过,不再讲!) 120 StringBuffer和StringBuilder 121 String和StringBuffer和StringBuilder使用要点 123 时间处理相关类 124 Date时间类(java.util.Date) 124 DateFormat类和...

    最新Java面试宝典pdf版

    68、你所知道的集合类都有哪些?主要方法? 47 69、两个对象值相同(x.equals(y) == true),但却可有不同的hash code,这句话对不对? 48 70、TreeSet里面放对象,如果同时放入了父类和子类的实例对象,那比较时使用的...

    史上最全java面试,103项重点知识,带目录

    30. 哪些集合类是线程安全的? 12 31. 迭代器 Iterator 是什么? 12 32. Iterator 怎么使用?有什么特点? 12 33. Iterator 和 ListIterator 有什么区别? 13 三、多线程 13 35. 并行和并发有什么区别? 13 36. 线程...

Global site tag (gtag.js) - Google Analytics