我曾经看到,只有String被用作HashMap中的一个键。尽管put()方法将Object作为参数。它的重要性是什么。如果其他任何对象也可以用作Key? 请提供答案。
答案 0 :(得分:8)
任何提供有意义的hashCode()
实现的对象都是地图中的完美关键候选者:请参阅Understanding the workings of equals and hashCode in a HashMap。
另外,正如@Jon所提到的,地图中的所有键都应该是相同的类型。
编辑:当然,您需要实施 equals()
和hashcode()
。我认为与另一个问题的链接标题清楚明了。但hashcode()
的愚蠢实施只会给你带来堕落HashMap
表现不佳。
EDIT2:正如@Adrian在他的回答中提到的,泛型将帮助你约束地图的键和值的类型。
参考文献:
答案 1 :(得分:6)
原始HashMap
确实会接受任何对象作为键。但是,指定要在地图中使用哪种键和值
Map<String, Whatever> map = new HashMap<String, Whatever>();
如果这样做,put()
方法只接受字符串。
NB:如果您选择使用自己的某个类作为键,请确保该类同时实现equals
和hashCode
,或者不实现任何一个!
答案 2 :(得分:3)
您经常看到“字符串”用作哈希键的一个可能原因是它是一个
不可变类。
不可变对象构成了很棒的地图键,因为人们不必担心它们的值 一旦他们在地图或集合中被修改,这将破坏 map或set的invaraints(第15项有效Java,第2版)
答案 3 :(得分:2)
你还没有展示你正在谈论的平台,但我现在假设它是Java。
您可以在HashMap
中使用任何类型的密钥,但假设您使用完整的通用版本,则需要指定该类型,然后使用它一致。例如,您可以使用URI作为密钥类型:
HashMap<URI, Integer> hitCountMap = new HashMap<URI, Integer>();
get
方法将Object作为关键参数类型,但您当然应该使用与放入地图相同类型的键。有关详细信息,请参阅this question。
答案 4 :(得分:1)
我们通常在HashMap中使用String作为键的一个原因是,因为String在Java中是不可变的,允许String缓存其哈希码,所以Java中的不可变String缓存其哈希码,并且不会在每次调用时计算String的hashcode方法,它使得它像HashMap密钥一样快。
答案 5 :(得分:0)
密钥类型可以是任何类型,包括(对于某些用例)对象。唯一的技术要求是equals(Object)
和hashcode()
正确实现了其实例可能用作键的所有类。在实践中,您还希望equals(Object)
的语义与所有可能的键类型/值的HashMap的预期行为一致。
但是,如果您确实需要使用Object作为键类型,IdentityHashMap可能是更好的选择。首先,它不使用equals(Object)
或hashcode()
,而是使用==
和关键对象的“身份哈希”值。