Java Map比較詳解

一)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
}

 

識別二維碼關注個人微信公衆號

本章完結,待續,歡迎轉載!
 
本文說明:該文章屬於原創,如需轉載,請標明文章轉載來源!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章