一)Map equals比较
方式一:基本类型比较
方式二:对象类型比较
先创建一个Book对象类,重写equals方法
package com.oysept.map;
public class Book {
private String title;
private Integer number;
public Book() {}
public Book(String title, Integer number) {
this.title = title;
this.number = number;
}
public String getTitle() {return title;}
public void setTitle(String title) {this.title = title;}
public Integer getNumber() {return number;}
public void setNumber(Integer number) {this.number = number;}
@Override
public String toString() {
return "[title=" + title + ", number=" + number + "]";
}
@Override
public boolean equals(Object o) {
if (!(o instanceof Book)) {
return false;
}
Book book = (Book) o;
if (this.title.equals(book.getTitle())
&& this.number.equals(book.getNumber())) { // 由于number是Integer类型, 所以需要用equals比较
return true;
}
return false;
}
}
测试源码:
package com.oysept.map;
import java.util.HashMap;
import java.util.Map;
public class MapCompare {
public static void main(String[] args) {
// 基本类型比较
Map<String, String> map1 = new HashMap<String, String>();
map1.put("ccc", "333");
map1.put("aaa", "111");
map1.put("bbb", "222");
Map<String, String> map2 = new HashMap<String, String>();
map2.put("bbb", "222");
map2.put("ccc", "333");
map2.put("aaa", "111");
System.out.println("map1和map2比较结果为: " + map1.equals(map2));
// 对象类型比较
Map<String, Book> map3 = new HashMap<String, Book>();
map3.put("ccc", new Book("CCC", 333));
map3.put("aaa", new Book("AAA", 111));
map3.put("bbb", new Book("BBB", 222));
Map<String, Book> map4 = new HashMap<String, Book>();
map4.put("aaa", new Book("AAA", 111));
map4.put("bbb", new Book("BBB", 222));
map4.put("ccc", new Book("CCC", 333));
System.out.println("map3和map4比较结果为: " + map3.equals(map4));
}
}
控制台效果图打印:
从打印结果来看,Map中元素存放的顺序是没有关系,只跟具体的值有关。
二)Map equals源码
java.util.Map继承了java.util.AbstractMap抽象类,在该类中实现了equals方法
public boolean equals(Object o) {
if (o == this)
return true;
if (!(o instanceof Map))
return false;
Map<?,?> m = (Map<?,?>) o;
if (m.size() != size()) // 判断比较的Map 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) { // 判断Map的value是否为空
if (!(m.get(key)==null && m.containsKey(key))) // value为空, 判断另一个Map是否存在相同的元素
return false;
} else {
if (!value.equals(m.get(key))) // 如果value不为空,再判断value是否相同
return false;
}
}
} catch (ClassCastException unused) {
return false;
} catch (NullPointerException unused) {
return false;
}
return true; // 当所有元素比较完之后,返回true
}
识别二维码关注个人微信公众号
本章完结,待续,欢迎转载!
本文说明:该文章属于原创,如需转载,请标明文章转载来源!