我试图检查Set的子类型是否返回HashMap的keySet()方法,并检查它是否是HashSet的实例,但事实并非如此。
由于我有一大堆密钥并且大量使用keys.contains(),所以如果它不是HashSet的类型,那么该方法使用起来可能很昂贵,并且它确实使我的程序变得很慢。
那么你知道keySet()方法返回什么子类型吗?是否有任何编程方式来检查“Set set”实例的特定类型?我想我可能只是将它分别变成一个HashSet,但这会占用更多的内存。
编辑:所以我查了一下。它是AbstractSet,那么AbstractSet在containsKey()中使用什么样的机制?如果它遍历所有元素并找到密钥,那就太贵了。你认为为他们的密钥创建一个单独的HashSet是个好主意吗?
最终编辑:好的,彻底检查了源代码。它确实使用哈希机制来检查密钥的存在。对于那些想知道我为什么问的人:我的程序需要永远运行:(。现在尝试调整它。
答案 0 :(得分:2)
这是HashMap
KeySet
中定义的私有内部类,如果你take a look,你可以看到它。
contains
的{{1}}方法只是调用地图的KeySet
(containsKey
,而且费用不高):
O(1)
答案 1 :(得分:2)
HashMap#keySet
javadoc解释说该集合是地图键的视图。由于此映射实现保证了get操作的恒定时间性能,因此您可以安全地期望keySet返回的Set提供类似的性能保证。
如果您不相信常识,可以随时直接致电map.containsKey
。