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

由于我有大量的键并大量使用keys.contains(),因此,如果它不是HashSet类型,则使用该方法可能会很昂贵,并且会使我的程序变慢。

那么您知道keySet()方法返回什么子类型吗?有什么编程方式可以检查“设置集”实例的特定类型?我想我可能只是将其分别转换为HashSet,但这会占用更多内存。

编辑:所以我检查了。它是AbstractSet,那么AbstractSet在containsKey()中使用哪种机制?如果遍历所有元素并找到密钥,那么它将非常昂贵。您认为为其键创建单独的HashSet是一个好主意吗?

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

最佳答案

这是在HashMap中定义的私有内部类,称为KeySet,您可以查看是否take a look

containsKeySet方法仅调用地图的containsKey(这是O(1),一点也不昂贵):

896    public boolean contains(Object o) {
897        return containsKey(o);
898    }

10-06 12:43