hash map和hash table中的key类型有什么限制吗?----面试题。我认为是的,我们可以根据需要对其进行自定义。
2 回答
从技术上讲,没有。通常,您希望使用实现 equals() 和 hashCode() 的对象,尽管这不是绝对必要的。如果你不这样做,那么它将使用 Object 定义的比较对象身份的基本实现。很多时候,这是不合适的,但有时很好。
从技术上讲,只要在 equals() 和 hashCode() 实现中使用的值是不可变的,键就不需要是不可变的。例如,如果你的类 Foo 使用字符串“foo”作为它的一部分,那么这个值“foo”不能改变。这是因为出于效率原因,哈希映射根据 hashCode() 值将键放入桶中。如果 hashCode 突然改变,hash map 是不知道的,并且密钥现在将存在于错误的存储桶中,您将遇到令人讨厌的错误,因为这样可能在您的 map 中有“重复”对象。希望这是有道理的。
需要考虑的几件事:
就“类型”而言,您不能使用原始类型。这是Java的语言限制。eg
HashMap<int, Foo>
无效,您需要使用HashMap<Integer, Foo>
根据 HashMap 的工作方式,key 应该有一个有意义的 hashCode() 和 equals() 实现。它如何“有意义”取决于您的需要。Object 中的默认实现可能已经满足了您的需求,但您需要意识到这一点。
一旦将对象实例作为键放入 Map 中,其 hashCode() 和 equals() 应该保持一致。您永远不应该放入地图,并将对象实例的状态更改为 Key 并导致 hashCode()/equals() 返回不同的值。确保它的最简单方法当然是使用不可变对象作为键。但是,使用可变对象仍然可以,但在您的代码中,您确保不会发生更改键的状态。