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

   今天网上有人问怎么比较两个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());
    }

 

   

猜你喜欢

转载自liuchang615270.iteye.com/blog/2372303