2 xuxiaoyinliu xuxiaoyinliu 于 2016.02.19 15:04 提问

两个HashMap可以用equal方法比较是否相等吗?

试了一下是可以的但是看源码又不太明白

        HashMap<String,String>n1=new HashMap<String,String>(){{put("2","s");}};
        HashMap<String,String>n2=new HashMap<String,String>(){{put("2","s");}};
        System.out.println(n1.equals(n2));

4个回答

wojiushiwo945you
wojiushiwo945you   Ds   Rxr 2016.02.19 17:00
已采纳

头两行数据是jdk1.7的新功能,看了下HashMap的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())
            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;
    }

官方解释是这样的:
1 检查两个对象是否是同一个对象引用,如果是,则显然相等;
2 检查比较对象是否是Map 类型,且与当前Map对象有相同的size个数
3 迭代当前对象,并且一一比较当前对象的每个key是否都在被比较对象中,并且值也相等。
其实很好理解,两个Map相等,则必然两个Map有相同的size,相同的keySet,并且每个key对应的value也相等。

caozhy
caozhy   Ds   Rxr 2016.02.19 15:14

实验了下,似乎确实可以。虽然从来没敢这么任性地用过。
而且和插入的顺序都无关,只要key一一对应,而key相同的,value相同,就返回ture。

cangyue080180
cangyue080180   2016.02.19 15:45

equals本来就是比较对象的,应该可以吧。

xuxiaoyinliu
xuxiaoyinliu 估计有局限,但还没来得及仔细看源码,求反面示例
接近 2 年之前 回复
luochoudan
luochoudan   Ds   Rxr 2016.02.19 17:47

可以,毕小宝同学说的很明白了。

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!