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币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
从HashMap 的 key 看 Java 中"=="与"equals"的区别
在Java中如何判断两个变量是否相等是很重要的。一般情况下,地址相等那么内容肯定相等,反之不是。因而,在判断相等与否时,我们需要分清需求,到底是地址相等还是内容相等。所以引申出两种判断方法(需重写equals为该逻辑后实现):“==” 比较的是值:变量(栈内存)中存放的对象的堆内存地址“equals”比较两个对象的内容(栈内存中存放的内容,不是比地址)对基本/引用类型的区别:
java关于比较两个字符串时的等号和equal
== :     等号比较两个纯字符串时,比较基本类型,如果值相同,则返回 true       而比较引用时,如果引用指向同一内存中的同一对象,则返回 true equals: 只比较两个对象的内容是否相等,相等则返回true public void testString(){ String a = "aa"; String b = new Stri
equal()和HashCode()比较
引用http://blog.sina.com.cn/s/blog_59e0c16f0100xne7.html 1.为什么要重载equal()? 因为Object的equal()默认是比较两个对象的引用,意思就是指向同一内存的,相等,否则不相等。如果需要利用对象里面的值来判断是否相等则需要重载equal()。 2.为什么要重载HashCode()? 一般不需要重载Hash
java equal和==的比较,尤其注意基本类型和基本类型的包装类型的比较
java中equals方法和“==”的区别:  equals 方法是 java.lang.Object 类的方法。  有两种用法说明:  (1)对于字符串变量来说,使用“==”和“equals()”方法比较字符串时,其比较方法不同。  “==”比较两个变量本身的值,即两个对象在内存中的首地址。  “equals()”比较字符串中所包含的内容是否相同。  比如: 
String类型的比较(为什么比较字符串是否相等时不用=号用equals()的)
class StringDemo { public static void main(String[] args) { char[] msg = {'h','e','l','l','o'}; String t1 = "hello"; String t2 = new String("hello"); String t3 = ne
字符串比较用equal以及==的区别
从object类来看,equal和==都是比较的对象的地址,但是在String中,equal比较的是内容是否相等,因为在String中对equal进行了重写。 String 字符串类:笔试题目:new String(“abc”)创建了几个对象?两个对象, 一个对象是 位于字符串常量池中,一个对象是位于堆内存中。如下代码:test(null),给传入null的时候如果str放在前面调用equal的方
两个 Long 类型为什么不能直接用==比较
这要说到==和 equals 的区别了。 1. ==比较的是两个对象在内存中的地址值(栈中的内容)。 2.equals 是 java.lang.Object 类的一个方法。equals 比较的是两个对象的内容(堆中的内容)。java 中所有的类都默认继承于 Object,所以所有的类都有这个方法。 但是 Long 是一个对象,是对 long 的封装。我们看一下 Long 对象的源
判断两个对象是否相等,hashcode和equals方法的联系
1、在集合中考虑两个对象是否相同的规则是: 第一步:如果hashCode()相等,则进行第二步,否则不相同。 第二步:查看equals()相等就相等,否则不相同 2、hashcode是对象或者变量通过哈希算法计算出来的hash值,不同对象是不一样的, 同一个对象是不变的。 3、equals()相等,hashcode一定相等 hashcode不相等,equals一定不相同 4、在重写类
Java中两个对象的比较 equals()方法和==号的区别
在Java中,时不时我们会把两个对象进行,然而得到的结果却不是我们想的结果,这是怎么回事呢? 一、两种形式的比较:比较时,我们要弄清楚是哪一种比较。       1.值类型比较       即内容相同,我们就认为是相等的。比如:int i=5;int j =5;此时我们说i和j相等,其实指的是i和j的内容相同。       2.引用类型比较      但在Java中,除了
两个HashMap里面的内容是否相等?
Map map1 = new HashMap(); Map map2 = new HashMap(); 比较方法一:map1.equals(map2)) 比较方法二: Iterator> it1 = map1.entrySet().iterator(); while(it1.hasNext()){ Entry entry1 = it1.next(); Integer integ