字符串作为HashMap中的键

时间:2009-12-13 10:10:31

标签: java hashmap

我曾经看到,只有String被用作HashMap中的一个键。尽管put()方法将Object作为参数。它的重要性是什么。如果其他任何对象也可以用作Key? 请提供答案。

6 个答案:

答案 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:如果您选择使用自己的某个类作为键,请确保该类同时实现equalshashCode,或者不实现任何一个!

答案 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(),而是使用==和关键对象的“身份哈希”值。