使用Java作为Map键的对象的问题

时间:2011-11-20 16:04:57

标签: java

给定一个对象,我们将调用只包含2个int成员值的loc,我相信我需要提出一种机制来为该对象生成一个哈希码。我在下面尝试的内容不起作用,因为它使用对象引用,尽管具有相同的成员变量,但2个引用将是不同的。

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)));

经过一些阅读后,似乎我需要为此对象滚动自己的哈希码,并使用该哈希码作为键。只是想确认我在这里是正确的轨道,如果有人可以指导我简单的实现,那将是非常好的。

由于

5 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:1)

是的,你走在正确的轨道上。

有关详细信息,请参阅articles like this

有一种 lot 实现哈希码的不同方法,您可能只想组合每个integer原语的哈希码。

答案 2 :(得分:1)

编写正确的equals和hashcode方法可能很棘手,而错误的后果可能是微妙而烦人的。如果你能够,我会使用apache commons-lang库并利用HashCodeBuilderEqualsBuilder类。它们将使实现更加容易。使用这些库的好处是,更难以使锅炉板错误,它们隐藏了这些方法往往会产生的视觉噪音,并且使得人们更难以在很长一段时间内使用并弄乱它。当然,另一种选择是让你的IDE为你生成那些可行的方法,但只是创造了更多的嘈杂代码呕吐Java。

答案 3 :(得分:1)

如果您想在地图中将类型用作关键字类型,则必须提供 equals hashCode 。幸运的是,您不必手动编写这些实现。 Eclipse(我猜其他IDE也可以)为您生成这个样板。或者您甚至可以使用Project Lombok

理想情况下,用作地图中键的对象应为不可变。这可以帮助您避免因突变背景下的平等问题导致的许多错误。

答案 4 :(得分:0)

您需要同时实施hashCode()equals()。 Joshua Bloch的 Effective Java 应该是你问题“how”部分的权威来源,我不确定是否可以在这里重现它,所以我只想推荐你。