咖啡伴侣

呆在上海
posts - 163, comments - 156, trackbacks - 0, articles - 2

Hash code

Posted on 2010-03-03 16:03 oathleo 阅读(1668) 评论(4)  编辑  收藏 所属分类: Java
如果两个对象equal,那么它们的hashCode值一定要相同;2、如果两个对象的hashCode相同,它们并不一定equal

当Set要添加新的元素时,先调用这个元素的hashCode方法,就一下子能定位到它应该放置的物理位置上。如果这个位置上没有元素,它就可以直接存储在 这个位置上,不用再进行任何比较了;如果这个位置上已经有元素了,就调用它的equals方法与新元素进行比较,相同的话就不存了,不相同就散列其它的地址。

所以两个不equal的对象,有相同的hash,是可以存进Set的。

class HashNode {
    int id;
   
    public HashNode(int id){
        this.id = id;
    }
   
    public int hashCode() {
        return id;
    }
   
    public boolean equals(Object obj) {
        return false;
    }
}

public class HashTest {

    public static void main(String[] args) {
        HashNode n1 = new HashNode(1);
        HashNode n2 = new HashNode(1);
       
        HashMap map = new HashMap();
        map.put(n1, "111");
        map.put(n2, "222");
       
        System.out.println(n1.equals(n2));
        System.out.println(n1.hashCode() == n2.hashCode());
        System.out.println(map.keySet().size());
    }

}

Feedback

# re: Hash code  回复  更多评论   

2010-03-16 21:42 by 张贝贝
比较两个对象是不是得重写equals方法啊?

# re: Hash code  回复  更多评论   

2010-03-17 08:41 by oathleo
@张贝贝
比较 是指?如果是内容的比较 肯定是要重写了。这种情况也是最常见的。
当然如果单纯比较 内存地址(或者说对象引用本身) 就没有必要了

# re: Hash code  回复  更多评论   

2010-03-17 20:31 by 张贝贝
嗯,很对,再问一点,内存地址一样,是不是内容就一定一样了?

# re: Hash code  回复  更多评论   

2010-03-18 18:24 by oathleo
@张贝贝
门牌号一样,房子里面的人必然的一样。

只有注册用户登录后才能发表评论。


网站导航: