A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 宋国涛 黑马帝   /  2011-9-23 00:38  /  2219 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

(1)通常来说,一个类的两个实例对象用equals方法比较的结果相等的时候,他们的哈希码也必须相等,但反之则不成立,即equals方法比较结果不相等的对象可以有相同的哈希码,或者说哈希码相同的两个对象的equals方法比较的结果可以不等,例如,字符串BB和Aa的equals方法比较的结果肯定不相等,但是他们的hashCode方法返回值相等。
(2)当一个对象被存储到HashSet集合中以后,就不能修改这个对象中的某些参与计算哈希码的字段了,否则,对象修改以后的哈希码与最初存储金集合的哈希码就不同了,在这种情况下,即使在contains方法使用该对象的当前引用作为的参数去HashSet集合中检索对象,也将返回找不到对象的结果,这也会导致无法从Hash集合中单独的删除当前的对象,从而造成内存泄漏。

以上的两个结论,第二个理解了,第一个还有些疑惑,希望大家解惑。。。

评分

参与人数 1技术分 +1 收起 理由
wangfayin + 1

查看全部评分

2 个回复

倒序浏览
黑马网友  发表于 2011-9-23 09:35:40
沙发
Hashcode() 和equals(0都是判断对象否相等的。但是他们是有区别的。
equals这个方法是给用户调用的,如果你想判断2个对象是否相等,你可以重写equals方法,然后在代码中调用,就可以判断他们是否相等了。简单来讲,equals方法主要是用来判断从表面上看或者从内容上看,2个对象是不是相等。比如有个学生类,属性只有姓名和性别,那么我们可以认为只要姓名和性别相等,那么就说这2个对象是相等的。
hashcode方法一般用户不会去调用,比如在hashmap中,由于key是不可以重复的,他在判断key是不是重复的时候就判断了hashcode这个方法,还是刚刚的例子,如果姓名和性别相等就算2个对象相等的话,那么hashcode的方法也要返回姓名的hashcode值加上性别的hashcode值,这样从逻辑上,他们就一致了。

评分

参与人数 1技术分 +2 收起 理由
admin + 2 我很赞同

查看全部评分

回复 使用道具 举报
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;
    }
这是String的equals方法的源码,是一个字符一个字符的比较,这样比较BB和Aa当然是不相等的,但是String的hashcode方法是这样的:
public int hashCode() {
        int h = hash;
        if (h == 0 && count > 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;
    }
BB的hashcode是:66*31+66,Aa的hashcode是65*31+97,刚好是相等的,所以返回的hashcode是相等的。

评分

参与人数 1技术分 +2 收起 理由
admin + 2

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马