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