两个具有相同哈希码的不相等对象

2022-09-02 05:25:53

Hashcode() 和 equals() 概念是

1) 如果根据 equal() 两个对象相等,则在这两个对象中的每个对象上调用哈希码方法应生成相同的哈希码。

另一个是

2)如果两个对象根据 equal() 不相等,则不需要在两个对象的每个对象上调用哈希码方法必须生成不同的值。

我尝试并理解了第一个,这是第一个点的代码。

public class Test {
    public static void main(String[] args) {

        Map<Integer, Integer> map = new HashMap<Integer, Integer>();
        map.put(1, 11);
        map.put(4, 11);
        System.out.println(map.hashCode());
        Map<Integer, Integer> map1 = new HashMap<Integer, Integer>();
        map1.put(1, 11);
        map1.put(4, 11);
        System.out.println(map1.hashCode());
        if (map.equals(map1)) {
            System.out.println("equal ");
        }
    }
}

上面的程序为两个不同的对象提供相同的哈希码。

有人可以用一个例子来解释我,根据equals()不相等的两个不同的对象如何具有相同的哈希码。


答案 1

2)如果两个对象根据 equal() 不相等,则不需要在两个对象的每个对象上调用哈希码方法必须生成不同的值。

根据哈希函数的不同,2 个不同的对象可以具有相同的哈希代码。但是,2个相同的对象在散列时必须产生相同的结果(除非有人实现了具有随机数的散列函数,在这种情况下它是无用的)

例如,如果我正在对整数进行哈希处理,而我的哈希函数只是,那么数字和数字将产生相同的结果。这并不意味着这些数字是相同的。(n % 10)1727


答案 2

字符串示例(以下所有字符串的哈希码均为 0):

public static void main(String[] args) {
    List<String> list = Arrays.asList("pollinating sandboxes",
                                      "amusement & hemophilias",
                                      "schoolworks = perversive",
                                      "electrolysissweeteners.net",
                                      "constitutionalunstableness.net",
                                      "grinnerslaphappier.org",
                                      "BLEACHINGFEMININELY.NET",
                                      "WWW.BUMRACEGOERS.ORG",
                                      "WWW.RACCOONPRUDENTIALS.NET",
                                      "Microcomputers: the unredeemed lollipop...",
                                      "Incentively, my dear, I don't tessellate a derangement.",
                                      "A person who never yodelled an apology, never preened vocalizing transsexuals.");
    for (String s : list) {
        System.out.println(s.hashCode());
    }
}

(从这篇文章中偷来的)。


推荐