具有不同对象的重复哈希码

时间:2017-04-13 16:54:15

标签: java

public Class myClass{
private final int[][] board;
}

我有

LinkedHashMap<Integer,Object> myMap

其中Integer是我使用Arrays.deepHashCode

创建的哈希码
public int hashCode() {
        int hash = 5;
        hash = 89 * hash + Arrays.deepHashCode(this.board);
        return hash;
    }

public boolean equals(Object anObject) {
        if (anObject == null) return false;
        if (anObject == this) return true;
        if (!(anObject instanceof myClass))return false;

        Puzzle anotherClass = (myClass)anObject;
        return Arrays.deepEquals(this.board,anotherClass.board);
    }

我获得了新对象,只有当它们不存在时我才需要将它们添加到myMap。 我尝试使用myMap.containsKey(hashcode)检查哈希码,显然我正在为不同的对象获取重复的哈希码。

当我从myMap.containsKey(hashcode)获得真实时,我试图检查更多细节但是我无法将它们添加到myMap,因为它们具有相同的键!

是否有针对此问题的解决方法,因为使用ArrayList并使用contains()进行检查非常慢且我有大量迭代。

2 个答案:

答案 0 :(得分:1)

看起来你在这里缺少一些关键点。

首先,您不需要在您的Map中使用哈希码值作为键。相反,您必须使用实现哈希码的对象。

第二,作为合同的一部分,您必须实现Object类的hashcode()和equals()方法,以确保这些类(如HashMap,HashSet等)。谁依赖这些方法正常工作

第三,您必须对如何编写好的哈希函数进行一些研究,以最大限度地减少两个对象具有相同哈希码值的可能性。  请查看以下主题

What is a best practice of writing hash function in java?

How to write hashCode method for a particular class?

答案 1 :(得分:-1)

我暂时将其留给子孙后代,但基本上其他海报是正确的,你应该使用HashSet。请参阅以下评论,了解如何巧妙地实现您自己的集合类。你有正确的想法,但细节正在绊倒你。

错了,不能工作:

我在这里走出困境,并猜测你没有为你的班级实施equals()

如果您实施hashcode(),您还必须实施equals(),否则无效。 (或者至少很多事情都不能很好地发挥作用。)