给定一个对象,我们将调用只包含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)));
经过一些阅读后,似乎我需要为此对象滚动自己的哈希码,并使用该哈希码作为键。只是想确认我在这里是正确的轨道,如果有人可以指导我简单的实现,那将是非常好的。
由于
答案 0 :(得分:5)
是的,您需要覆盖equals()
和hashCode()
,并且它们需要表现一致(即,相等的对象必须具有相同的哈希码)。不,你不直接使用hash coe; Map
使用它。
答案 1 :(得分:1)
答案 2 :(得分:1)
编写正确的equals和hashcode方法可能很棘手,而错误的后果可能是微妙而烦人的。如果你能够,我会使用apache commons-lang库并利用HashCodeBuilder和EqualsBuilder类。它们将使实现更加容易。使用这些库的好处是,更难以使锅炉板错误,它们隐藏了这些方法往往会产生的视觉噪音,并且使得人们更难以在很长一段时间内使用并弄乱它。当然,另一种选择是让你的IDE为你生成那些可行的方法,但只是创造了更多的嘈杂代码呕吐Java。
答案 3 :(得分:1)
如果您想在地图中将类型用作关键字类型,则必须提供 equals
和 hashCode
。幸运的是,您不必手动编写这些实现。 Eclipse(我猜其他IDE也可以)为您生成这个样板。或者您甚至可以使用Project Lombok。
理想情况下,用作地图中键的对象应为不可变。这可以帮助您避免因突变背景下的平等问题导致的许多错误。
答案 4 :(得分:0)
您需要同时实施hashCode()
和equals()
。 Joshua Bloch的 Effective Java 应该是你问题“how”部分的权威来源,我不确定是否可以在这里重现它,所以我只想推荐你。