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

标签 java oop

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

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(如果您的对象用作键), HashSet, LinkedHashSet.

请注意,在您的情况下,问题甚至更糟:多次调用 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));
}

关于java - 如果两个相同的对象具有不同的哈希码,有什么缺点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33320525/

相关文章:

java - 如何刷新java中的结束符?

oop - 使用对象变量激活和停用 WordPress Hook 的问题

swift - 当您将对象作为参数传递时,何时发生实例化

c# - 从父 C# 调用子方法

c# - 防止对象进入某种状态后被更改? (C#)

java - 模拟 “PSQLException: FATAL: sorry, too many clients already”

java - corePoolSize = 0 的 ScheduledThreadPoolExecutor 在一个 CPU 核心上导致 100% 负载

java - Camel netty组件: Failed to create selector

java - MultiPartFile 删除得太早

php - 了解域对象 + 数据映射器模式?