日期:2014-05-20  浏览次数:20722 次

为什么重写equals方法的同时要重写hashCode方法
如题:hashCode是什么? 如果两个对象内容相同,但引用不同是不是就是hashCode不同?

------解决方案--------------------
这和存放对象的容器有关,可以参考一下:
http://wenku.baidu.com/view/9070f05c312b3169a451a4af.html

------解决方案--------------------
有些东西不要问为什么sun公司就是这么规定的
hashCode是哈希码值
基于对象的内容相同,而保留hashCode的实现不同,那么很可能某两个对象明明是“相等”,而hashCode却不一样。
这样,当你用其中的一个作为键保存到hashMap、hasoTable或hashSet中,再以“相等的”找另一个作为键值去查找他们的时候,则根本找不到。
------解决方案--------------------
你肯定用了set集合类。 因为set不能出现重复的元素。


hashcode: @return the hash code value for this list

返回的是一个地址,可以认为是对象的物理地址。
如果对象不同,肯定返回值也不同了呗
另外,引用就是保存对象的地址。。所以引用的是同一个对象的地址的多个备份嘛。这么理解。
------解决方案--------------------
探讨
如题:hashCode是什么? 如果两个对象内容相同,但引用不同是不是就是hashCode不同?

------解决方案--------------------
之前做过一道题,上面的ArrayList的contains(Object)就不用重写hashcode,但是HashSet的contains就需要。为什么呢?我查了下源码,发现contains的核心部分是getEntry<Key>!=null(因为HashSet其实就是没有value的HashMap),下面是源码
Java code
final Entry<K,V> getEntry(Object key) {
        int hash = (key == null) ? 0 : hash(key.hashCode());
        for (Entry<K,V> e = table[indexFor(hash, table.length)];
             e != null;
             e = e.next) {
            Object k;
            if (e.hash == hash &&
                ((k = e.key) == key || (key != null && key.equals(k))))
                return e;
        }
        return null;
    }