繁体   English   中英

如果两个相同的对象具有不同的哈希码,那么缺点是什么

[英]What is the drawback if two same objects have different hashcode

我知道不同的对象可能具有相同的哈希码。 但是,如果相等的对象具有不同的哈希码(只是一个奇怪的问题,所以不要问我为什么这样做):

public class Myclass{
    int data = 0;
    @Override
    public boolean equals(Object obj) {
        return obj instanceof  Myclass && ((Myclass) obj).data == this.data;
    }
    @Override
    public int hashCode() {
        return (int)(Math.random()*1000);
    }
}

如果您未能满足equals-hashCode协定,那么依赖于此合同的任何算法或数据结构都可能无法正常工作。 此类数据结构的示例包括HashMapLinkedHashMapConcurrentHashMapHashtable (如果您的对象用作键), HashSetLinkedHashSet

请注意,在您的情况下问题更严重:当多次调用hashCode方法时,您在同一对象上返回不同的hashCode。 所以你甚至不需要两个相同的对象来打破集合。 例如,这样的代码通常打印为false(尽管偶尔可以打印为true):

public static void main(String[] args) {
    Myclass m = new Myclass();
    Set<Myclass> set = new HashSet<>();
    set.add(m);
    System.out.println(set.contains(m));
}

您在代码中拥有的不是具有不同哈希码的两个相等对象,而是在每次调用hashcode()将返回不同哈希码的对象。

会发生什么事情是你不能在哈希中使用这个类 - 因为你每次都会得到不同的哈希码,你不能从哈希中得到你的对象,并且每次你在哈希中插入一个对象时,它将被视为散列中不存在的

Hashcode用于HashMap或HashSet等数据结构中,以确定特定对象的存储位置。 如果两个对象以相同的哈希码结束,那么当它们从基于哈希的结构存储或检索时会导致混淆。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM