2013-03-27 72 views
3

散列映射和散列表中的键类型是否存在约束?----访问问题。 我认为是的,我们可以根据需要进行定制。散列映射数据类型是否有任何约束

+2

必须实现'hashCode()'和'equals()'有意义。 – jlordo 2013-03-27 01:02:50

+3

键应该是不可变的,否则会遇到奇怪的问题。 – 2013-03-27 01:04:35

回答

2

从技术上讲,没有。通常,您想要使用实现equals()和hashCode()的对象,尽管这不是必需的。如果你不这样做,那么它将使用Object定义的基类实现来比较对象标识。很多时候,这是不恰当的,但有时候很好。

从技术上讲,只要equals()和hashCode()实现中使用的值是不可变的,密钥不需要是不可变的。例如,如果您的Foo类使用字符串“foo”作为它的一部分,那么该值“foo”不得更改。这是因为哈希映射出于效率原因将密钥放入基于hashCode()值的桶中。如果hashCode突然变化,那么散列图就不知道了,而且键将存在于错误的桶中,并且会遇到令人讨厌的bug,因为这样就有可能在地图中存在“重复”对象。希望这是有道理的。

1

几件事情要考虑:

  1. 只是对“类型”,则无法使用基本类型。这是Java的语言约束。例如HashMap<int, Foo>是无效的,你需要使用HashMap<Integer, Foo>

  2. 基础上的方式HashMap的工作,关键要有一个有意义实现的hashCode()和equals()的。它是如何“有意义”取决于你的需要。 Object中的默认实现可能已经满足您的需求,但您需要了解它。

  3. 一旦一个对象实例放入Map中作为键,它的hashCode()和equals()应该保持一致。您不应该放入地图,并将对象实例的状态更改为Key,并使hashCode()/ equals()返回不同的值。确保它最简单的方法当然是使用不可变对象作为关键。但是,使用可变对象仍然很好,但在代码中,确保不会改变键的状态。