原来常用的集合类都实现了equals方法
程序员文章站
2022-05-28 16:58:23
...
今天网上有人问怎么比较两个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()); }
下一篇: io之FileOutputStream