如果hashCode相同并且equals为真,Java HashMap如何识别关键对象?

标签 java hashmap equals

我一直认为 HashMap 是通过使用 hasCode 和 equals 来识别它的键的。但这段代码仍然没有给我返回值。我错过了什么?

import java.util.HashMap;
import java.util.Map;

/**
 * Created by kic on 25.04.15.
 */
public class TypePair {
    private final Class a;
    private final Class b;

    public TypePair(Class a, Class b) {
        this.a = a;
        this.b = b;
    }

    public TypePair(Object a, Object b) {
        this.a = a.getClass();
        this.b = b.getClass();
    }

    public boolean isPair (Object a, Object b) {
        return this.a.isAssignableFrom(a.getClass()) && this.b.isAssignableFrom(b.getClass());
    }

    @Override
    public boolean equals(Object obj) {
        if (obj instanceof TypePair) {
            return a.isAssignableFrom(((TypePair) obj).a) && b.isAssignableFrom(((TypePair) obj).b);
        } else {
            return false;
        }
    }

    @Override
    public int hashCode() {
        return 1;
    }

    public static void main(String[] args) {
        TypePair a = new TypePair(Number.class, String.class);
        TypePair b = new TypePair(12, "hello");

        Map<TypePair, Boolean> test = new HashMap<>();
        test.put(a, true);

        System.out.println(a.hashCode() == b.hashCode());
        System.out.println(a.equals(b));
        System.out.println("und? " + test.get(a));
        System.out.println("und? " + test.get(b));
    }
}

此代码打印:

true
true
und? true
und? null

最佳答案

您的 equals() 实现违反了契约(它不是对称的),这就是它无法正常工作的原因。

你需要使用类似的东西:

@Override
public boolean equals(Object obj) {
    if (obj instanceof TypePair) {
        TypePair objTypePair = (TypePair) obj;
        return a            .isAssignableFrom(objTypePair.a) && b            .isAssignableFrom(objTypePair.b) ||
               objTypePair.a.isAssignableFrom(a)             && objTypePair.b.isAssignableFrom(b);
    } else {
        return false;
    }
}

关于如果hashCode相同并且equals为真,Java HashMap如何识别关键对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29865910/

相关文章:

java - 我的 equals/hashCode 方法是否应该检查对象 ID?

java - 为什么 assertEquals(new Object[] {"abc"}, new Object[] {"abc"});不失败?

java - 程序应在 Textfield 更改其文本后等待

java - HashMap Java 避免冲突的例子

hashmap - 如何实现有两个键的HashMap?

java - 约束特定键 - HashMap 的约定 - Java

java - 为什么我的 equals 方法不起作用?

java - 如何覆盖main中的实例变量/方法?

java - 如何将配置从配置单元脚本传递到 UDF

java - Java中时域到频域的转换