HashMap的keySet()返回的Set的子类型是什么?

时间:2013-07-30 19:47:17

标签: java collections hashmap set hashset

我试图检查Set的子类型是否返回HashMap的keySet()方法,并检查它是否是HashSet的实例,但事实并非如此。

由于我有一大堆密钥并且大量使用keys.contains(),所以如果它不是HashSet的类型,那么该方法使用起来可能很昂贵,并且它确实使我的程序变得很慢。

那么你知道keySet()方法返回什么子类型吗?是否有任何编程方式来检查“Set set”实例的特定类型?我想我可能只是将它分别变成一个HashSet,但这会占用更多的内存。

编辑:所以我查了一下。它是AbstractSet,那么AbstractSet在containsKey()中使用什么样的机制?如果它遍历所有元素并找到密钥,那就太贵了。你认为为他们的密钥创建一个单独的HashSet是个好主意吗?

最终编辑:好的,彻底检查了源代码。它确实使用哈希机制来检查密钥的存在。对于那些想知道我为什么问的人:我的程序需要永远运行:(。现在尝试调整它。

2 个答案:

答案 0 :(得分:2)

这是HashMap KeySet中定义的私有内部类,如果你take a look,你可以看到它。

contains的{​​{1}}方法只是调用地图的KeySetcontainsKey,而且费用不高):

O(1)

答案 1 :(得分:2)

HashMap#keySet javadoc解释说该集合是地图键的视图。由于此映射实现保证了get操作的恒定时间性能,因此您可以安全地期望keySet返回的Set提供类似的性能保证。

如果您不相信常识,可以随时直接致电map.containsKey