我试图检查HashMap的keySet()方法返回的Set的子类型,并检查它是否是HashSet的实例,但不是。
由于我有大量的键并大量使用keys.contains(),因此,如果它不是HashSet类型,则使用该方法可能会很昂贵,并且会使我的程序变慢。
那么您知道keySet()方法返回什么子类型吗?有什么编程方式可以检查“设置集”实例的特定类型?我想我可能只是将其分别转换为HashSet,但这会占用更多内存。
编辑:所以我检查了。它是AbstractSet,那么AbstractSet在containsKey()中使用哪种机制?如果遍历所有元素并找到密钥,那么它将非常昂贵。您认为为其键创建单独的HashSet是一个好主意吗?
最终编辑:确定,彻底检查了源代码。它确实使用哈希机制来检查密钥的存在。对于那些想知道为什么我问的人:我的程序永远需要运行:(。现在尝试对其进行调整。
最佳答案
这是在HashMap
中定义的私有内部类,称为KeySet
,您可以查看是否take a look。contains
的KeySet
方法仅调用地图的containsKey
(这是O(1)
,一点也不昂贵):
896 public boolean contains(Object o) {
897 return containsKey(o);
898 }