在Java中使用对象作为映射键的问题

在Java中使用对象作为映射键的问题,java,Java,给定一个我们称之为loc的对象,它只包含2个int成员值,我相信我需要想出一种机制来为该对象生成hashcode。我在下面尝试的方法不起作用,因为它使用了一个对象引用,尽管有相同的成员变量,但这两个引用将是不同的 Map<Loc,String> mapTest = new HashMap<Loc,String>(); mapTest.put(new Loc(1,2), "String 1"); mapTest.put(new Loc(0,1

给定一个我们称之为loc的对象,它只包含2个int成员值,我相信我需要想出一种机制来为该对象生成hashcode。我在下面尝试的方法不起作用,因为它使用了一个对象引用,尽管有相同的成员变量,但这两个引用将是不同的

Map<Loc,String> mapTest = new HashMap<Loc,String>();
        mapTest.put(new Loc(1,2), "String 1");
        mapTest.put(new Loc(0,1), "String 2");
        mapTest.put(new Loc(2,2), "String 3");

        System.out.println("Should be String 2 " + mapTest.get(new Loc(0,1)));
Map-mapTest=newhashmap();
mapTest.put(新Loc(1,2),“字符串1”);
mapTest.put(新Loc(0,1),“字符串2”);
mapTest.put(新Loc(2,2),“字符串3”);
System.out.println(“应该是字符串2”+mapTest.get(新的Loc(0,1));
经过一些阅读,我似乎需要为这个对象滚动我自己的hashcode,并使用该hashcode作为键。我只是想确认我在这条路上走的是对的,如果有人能指导我去看一些简单的实现,那就太好了


谢谢

是的,你走对了方向

有关更多详细信息,请参阅


有很多不同的方法来实现hashcode,您可能只想组合每个
integer
原语的hashcode。

是的,您需要覆盖
equals()
hashcode()
,并且它们需要行为一致(即,相等的对象必须具有相同的hash代码)。不,您不直接使用哈希coe
Map
使用它。

您需要同时实现
hashCode()
equals()
。Joshua Bloch的高效Java应该是您问题“如何”部分的最终来源,我不确定是否可以在这里复制它,所以我只推荐您参考它

编写正确的equals和hashcode方法可能很棘手,出错的后果可能很微妙,也很烦人。如果您能够,我将使用ApacheCommonsLang库并利用和类。它们将使实现更容易。使用这些库的好处是,很难将锅炉板弄错,它们隐藏了这些方法可能产生的视觉噪音,并且使人很难在很长一段时间后再来把它搞砸。当然,另一种选择是让IDE为您生成这些方法,这些方法可以正常工作,但只会创建更多Java已知的嘈杂代码。

如果您想将您的类型用作映射中的键类型,重要的是,它提供了
equals
hashCode
的合理实现。幸运的是,您不必手动编写这些实现。Eclipse(我想还有其他IDE)可以为您生成这个样板文件。或者你甚至可以用它

理想情况下,用作映射中键的对象应该是不可变的。这可以使您避免因变异环境中的平等问题而导致的许多错误。