gpt4 book ai didi

java - HashMap 是否使用 HashSet 来存储它的键?

转载 作者:行者123 更新时间:2023-11-29 06:34:44 25 4
gpt4 key购买 nike

我想知道 HashMap 是否使用 HashSet 来存储它的键。我想是的,因为 HashMap 对应于 HashSet,而 TreeMap 对应于 TreeSet。

我查看了 HashMap 类的源代码,该方法返回一个由某种 Iterator 实现的 AbstractSet。

另外...当我写的时候

    HashMap map = new HashMap();

if(map.keySet() instanceof HashSet){
System.out.println("true");
}

上面的 if 语句永远不会运行。现在我不确定

有人可以解释一下 HashMap 是如何存储它的键的吗?

最佳答案

您实际上是在问两个不同的问题:

  1. HashMap 是否使用 HashSet 来存储它的键?
  2. HashMap.keySet() 是否返回一个 HashSet

这两个问题的答案是否定的,原因相同,但没有技术原因阻止 1. 或 2. 为真。

HashSet 实际上是 HashMap 的包装器; HashSet 有如下成员变量:

private transient HashMap<E,Object> map;

当一个对象被添加到集合中时,它填充一个 PRESENT 标记值作为映射的值。

现在 HashMap 将其数据存储在一个包含键值对的 Entry 对象数组中:

transient Entry<K,V>[] table;

而它的keySet()方法返回内部类KeySet的一个实例:

public Set<K> keySet() {
Set<K> ks = keySet;
return (ks != null ? ks : (keySet = new KeySet()));
}

private final class KeySet extends AbstractSet<K> {
// minimal Set implementation to access the keys of the map
}

因为 KeySet 是私有(private)内部类,所以您应该关心它只是一个任意的 Set 实现。

正如我所说,没有理由必须是这种情况。您绝对可以实现一个在内部使用 HashSetMap 类,然后让您的 Map 从中返回一个 HashSet .keySet()。然而,这将是低效且难以编码的;现有的实现比原始的 Map/Set 实现更健壮、更高效。

取自 Oracle JDK 1.7.0_17 的代码片段。您可以在 Java 安装目录的 src.zip 文件中查看您的 Java 版本的源代码。

关于java - HashMap 是否使用 HashSet 来存储它的键?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23378927/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com