0

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

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

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

编辑:所以我检查了。是AbstractSet,那么AbstractSet在containsKey()中使用了什么样的机制呢?如果它遍历所有元素并找到关键,它会非常昂贵。你认为为它们的键创建一个单独的 HashSet 是个好主意吗?

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

4

2 回答 2

2

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

如果你不相信常识,你可以map.containsKey直接打电话。

于 2013-07-30T19:53:53.347 回答
2

HashMap它是一个在被调用的内部定义的私有内部类KeySet,你可以看看

简单地调用地图的方法contains(这并不昂贵):KeySetcontainsKeyO(1)

896    public boolean contains(Object o) {
897        return containsKey(o);
898    }
于 2013-07-30T19:50:03.943 回答