黑马程序员技术交流社区

标题: 为什么在重写了equals()方法之后也必须重写hashCode()方法? [打印本页]

作者: 王少雷    时间: 2013-1-3 10:21
标题: 为什么在重写了equals()方法之后也必须重写hashCode()方法?
本帖最后由 王少雷 于 2013-1-3 17:45 编辑

为什么在重写了equals()方法之后也必须重写hashCode()方法?
如题求解释原理。

作者: 而今从头越2012    时间: 2013-1-3 10:43
首先你要知道他们的关系,有两点:
1、如果两个对象相同(即用equals比较返回true),那么它们的hashCode值一定要相同;
2、如果两个对象的hashCode相同,它们并不一定相同(即用equals比较返回false) 。

如果不重写equals,那么比较的将是对象的引用是否指向同一块内存地址,重写之后目的是为了比较两个对象的value值是否相等。特别指出利用equals比较八大包装对象
(如int,float等)和String类(因为该类已重写了equals和hashcode方法)对象时,默认比较的是值,在比较其它自定义对象时都是比较的引用地址。

看看下面的这段代码:
public boolean equals(Object anObject) {
    if (this == anObject) {
        return true;
    }
    if (anObject instanceof String) {
        String anotherString = (String)anObject;
        int n = count;
        if (n == anotherString.count) {
        char v1[] = value;
        char v2[] = anotherString.value;
        int i = offset;
        int j = anotherString.offset;
        while (n-- != 0) {
            if (v1[i++] != v2[j++])
            return false;
        }
        return true;
        }
    }
    return false;
    }


public int hashCode() {
    int h = hash;
    if (h == 0) {
        int off = offset;
        char val[] = value;
        int len = count;

            for (int i = 0; i < len; i++) {
                h = 31*h + val[off++];
            }
            hash = h;
        }
        return h;
    }
作者: 刘文超    时间: 2013-1-3 10:45
本帖最后由 刘文超 于 2013-1-3 13:13 编辑

楼上解释充分。。
作者: hanyahui    时间: 2013-1-3 10:59
上面的解释很好
作者: 何竹冬    时间: 2013-1-3 14:35
你好
哈希表结构的数据结构在存储元素时,保证元素唯一性就是靠hashCode和equals方法。
首先,判断hashCode如果要存储的元素hashcode与已存储的元素hashcode不同则视为不同元素会进行存储。
然后,如果hashcode相同继续进行equals判断地址值是否相同如果相同则视为同一个元素不会进行存储。
作者: 杨雯雯    时间: 2013-1-3 14:43
因为相同的对象必须返回的相同的哈希码。重写equals目的是为了比较两个对象的value值是否相等,hashcode是用于散列数据的快速存取,如利用HashSet/HashMap/Hashtable类来存储数据时,都是根据存储对象的hashcode值来进行判断是否相同的。
当原对象.equals(新对象)等于true时,两者的hashcode却是不一样的,由此将产生了理解的不一致,如在存储散列集合时(如Set类),将会存储了两个值一样的对象,
导致混淆,因此,就也需要重写hashcode()







欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2