【发布时间】:2014-04-30 03:01:01
【问题描述】:
我想知道 HashMap 是否使用 HashSet 来存储其键。我猜是这样,因为 HashMap 对应于 HashSet,而 TreeMap 对应于 TreeSet。
我查看了 HashMap 类的源代码,该方法返回了一个由某种迭代器实现的 AbstractSet。
另外...当我写的时候
HashMap map = new HashMap();
if(map.keySet() instanceof HashSet){
System.out.println("true");
}
上面的 if 语句永远不会运行。现在我不确定
有人能解释一下 HashMap 是如何存储它的键的吗?
【问题讨论】:
-
不,[在 Oracle JDK 中] 它没有。 Look at the implementation (on GrepCode),这应该很明显 HashMap 没有使用和底层的 HashSet。 (另外from the API你可以看到HashMap不是 HashSet的子类型,甚至也不符合Set接口。)
-
(非常重要,请参阅 HashMap 中的
Entry<K,V>[] table = (Entry<K,V>[]) EMPTY_TABLE;成员 - 使用的是数组,而不是 HashSet。) -
@user2864740 请注意,您的链接是 OpenJDK 实现,而不是 Oracle JDK。
-
所以您已经查看了
HashMap的来源,所以您知道答案是否定的。有趣的是,HashSet将其值作为键存储在HashMap中,但这是一个不同的问题。 -
@dimo414 也就是说,您看到的差异来自 7-update 和 8 版本中代码的演变,而不是 OpenJDK 和 Oracle JDK 之间的分歧。