关于java hashcode的采访问题()

时间:2011-07-14 10:32:14

标签: java collections

我最近参加了一次采访,并被问到以下问题。

有两个具有相同哈希码的对象。我在hashmap中插入这两个对象。

hMap.put(a,a); hMap.put(b,b);

其中a.hashCode()==b.hashCode()

现在告诉我hashmap里面有多少个对象?

我回答说只有一个对象,因为哈希码相等,两个对象相等,而hashmap不允许重复键。请告诉我,我的理解是否正确?

5 个答案:

答案 0 :(得分:32)

可以有两个具有相同哈希码的不同元素。所以你的答案是错误的。唯一保证的是,如果两个元素具有不同的哈希码,那么它们就是不同的。当两个元素具有相同的哈希码时,Java使用等于进一步的差异。

所以答案是一两个对象。

答案 1 :(得分:3)

hashmap中将有一个或两个对象。

如果两个对象不相等,即!a.equals(b),则两者都将被存储。

答案 2 :(得分:2)

不,hashCode是效率的初始查找,但除非a.equals(b)==true将有两个条目

答案 3 :(得分:1)

hashmap中将有两个对象,因为它们不是equals()

以下是证据:

public static void main(String[] args) {
    Object a = new Object() {
        public int hashCode() {
            return 1;
        }
    };

    Object b = new Object() {
        public int hashCode() {
            return 1;
        }
    };

    Map<Object, Object> map = new HashMap<Object, Object>();
    map.put(a, a);
    map.put(b, b);
    System.out.println(map.size());
}

输出:

2

如果我添加这样的equals()方法:

        public boolean equals(Object obj) {
            return obj.hashCode() == hashCode();
        }

输出:

1

根据Object.equals()的javadoc:

  

请注意,通常需要在重写此方法时覆盖hashCode方法,以便维护hashCode方法的常规协定,该方法声明相等的对象必须具有相同的哈希代码。

not 但是意味着两个不是equals()的对象不能共享相同的哈希码。

答案 4 :(得分:0)

根据a.equals(b),有一个或两个关键对象,以及一个或两个值对象,具体取决于== b。