2 hlhdidi hlhdidi 于 2016.04.06 20:15 提问

HashMap存入数据时,定义了equals方法,为什么还是会有相同的数据输出?
HashMap<Dog,String> map=new HashMap<Dog,String>();
    map.put(new Dog("博美",23), "xyy");
    map.put(new Dog("hhh",23), "hlh");
    这是HashMap的代码,在Dog类中,实现了equals方法和hashcode()方法,如下:
    public int hashCode() {
    final int prime = 31;
    int result = 1;
    result = prime * result + getAge();
    result = prime * result + ((getName() == null) ? 0 : getName().hashCode());
    return result;
}
@Override
public boolean equals(Object obj) {
    Animal other = (Animal) obj;
    if (getAge() == other.getAge())
        return true;
    if (this == obj)
        return true;
    if (obj == null)
        return false;
    if (getClass() != obj.getClass())
        return false;

    if (getName() == null) {
        if (other.getName() != null)
            return false;
    } else if (!(getName()).equals(other.getName()))
        return false;
    return true;
}
这里可以看到,当两个Dog类的age相同时,应当代表是相同的,不放入hashmap中,为什么最后输出结果后HashMap依然有两个元素?求大神解答。。

10个回答

qq_33867930
qq_33867930   2016.04.06 20:50

还要重写hashcode。

AEWW922
AEWW922   2016.04.06 20:49

equals()方法里的getAge()这样的方法前面加上this试试

AEWW922
AEWW922   2016.04.06 20:50

equals()方法里的getAge()这样的方法前面加上this试试

Franous
Franous   2016.04.06 21:05

HashMap是根据你的key的hashcode去散列位置的,不是equal..

Franous
Franous 说错了,equal也有用,hashcode用来散列位置,hashcode和equals共同确定是否一样,1楼正解
一年多之前 回复
bi_ma_wen
bi_ma_wen   2016.04.07 00:02

hashcode重写

m_912311697
m_912311697   2016.04.22 09:53
 楼主你混淆了!对于Dog对象而言,重写了equals于是年龄相同的是同一个对象,但是对于hashMap而言,内部依然会先调用hashCode()找到hash值,然后调用equals()

方法比较。你重写的是对象的equals方法!!

m_912311697
m_912311697   2016.04.22 09:52
 楼主你混淆了!对于Dog对象而言,重写了equals于是年龄相同的是同一个对象,但是对于hashMap而言,内部依然会先调用hashCode()找到hash值,然后调用equals()

方法比较。你重写的是对象的equals方法!!

m_912311697
m_912311697   2016.04.22 09:54
 楼主你混淆了!对于Dog对象而言,重写了equals于是年龄相同的是同一个对象,但是对于hashMap而言,内部依然会先调用hashCode()找到hash值,然后调用equals()方法比较。你重写的是对象的equals方法!!
m_912311697
m_912311697   2016.04.22 10:00

好久不用我说错了,这个代码没啥问题,我运行了一下!

m_912311697
m_912311697   2016.04.22 10:01

好久不用我说错了,这个代码没啥问题,我运行了一下!

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