Java Map比较详解

本文详细解析了Java中Map的比较方式,包括基本类型和对象类型的比较,并深入探讨了Map的equals方法源码,揭示了Map元素比较的具体实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

 

识别二维码关注个人微信公众号

本章完结,待续,欢迎转载!
 
本文说明:该文章属于原创,如需转载,请标明文章转载来源!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值