一)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
}
識別二維碼關注個人微信公衆號
本章完結,待續,歡迎轉載!
本文說明:該文章屬於原創,如需轉載,請標明文章轉載來源!