【问题标题】:check if Hashtable is full java检查Hashtable是否已满java
【发布时间】:2016-06-01 10:49:20
【问题描述】:

如主题所述,如何检查 Hashtable 是否已满(如果可以做到的话)?

拥有:

HashMap<Integer, Person> p = new HashMap <>();

我想一个人需要使用例如

if (p.size()>p "capacity"==true) 

我发现在某处创建了默认大小为 11 的哈希表,并且如果需要,它们的容量会自动增加……那么最后,哈希表可以满吗?

【问题讨论】:

  • 哈希表未满。增加他们的“容量”是为了让他们更快地访问,但这并不是他们可以容纳多少的真正限制。
  • @khelwood 正确,除了最后一部分...检查 sleiman 答案;)
  • @JordiCastilla 没有;我是对的,包括最后一部分。
  • @khelwood 真的吗?你读过吗?首先,它必须是一个真正的限制,如果不受对象本身的限制(如 sleiman 回答中所解释的),至少计算机内存会定义这个限制.. .所以海事组织你评论的最后一部分是不准确的。 :)
  • 您混淆了HashMapHashtable。后者的初始容量为11,但HashMap的初始容量为16。在任何一种情况下,容量都会增加,甚至在包含那么多元素之前,因为默认加载因子是0.75,所以它会在 13 日增加,resp。第 9 次插入。

标签: java hashtable capacity


【解决方案1】:

Hashtables 创建时默认大小为 11

这不是HashTable 的大小,而是它拥有的哈希桶数。

显然,具有 11 个哈希桶的表可以容纳 少于 11 个项目。也许不那么明显的是,一个有 11 个桶的表也可能包含 超过 11 个项目,这取决于 collision resolution 的使用情况。

Hashtable 能吃饱吗?

这取决于实现。使用单独链接的哈希表,例如 Java 的HashMap,即使它们的所有存储桶都已用完,也无法填满,因为我们可以继续将项目添加到每个存储桶的各个链中。但是,使用太少的哈希桶会导致性能显着下降。

另一方面,具有线性探测的哈希表,例如 Java 的 IdentityHashMap(严格来说,它不是一个有效的基于哈希的容器),当您用完存储桶时,可能会被填满。

【讨论】:

  • @Holger 它确实使用线性探测来解决冲突,请检查源代码。我以为霍尔格什么都知道:)
  • @Sleiman Jneidi:这是描述冲突解决。首先它仍然是散列。所以我反对“严格来说,这不是一个有效的基于哈希的容器”的说法。
  • 但这与线性探测无关,所以这是一个误导性的说法。特别是正如您所说的“基于哈希的有效容器”,这绝不表示您在谈论 Java 的 Map 接口的合同,而不是一般的基于哈希的容器。
  • 确实,尽管达到不适合 int 值范围的大小通常会导致 Java Maps 出现问题。我目前正在尝试最大化它并偶然发现IdentityHashMap 使用平面数组而HashMap 使用Entry 实例数组,这比简单的数组插槽消耗更多的内存。目前,我在HashMap 中的1&lt;&lt;28 元素上方不久,并且遇到了系统速度下降。我想,我需要一台不同的机器来找到实际的极限。有了这台机器,两张地图都不会达到极限……
【解决方案2】:

HashMap理论上最大容量为1073741824个元素

来自HashMap的源码

/**
 * The maximum capacity, used if a higher value is implicitly specified
 * by either of the constructors with arguments.
 * MUST be a power of two <= 1<<30.
 */
static final int MAXIMUM_CAPACITY = 1 << 30;

但这里限制了托管数组(用于支持数组)在 Java 中可以容纳的元素数量。当您尝试分配大数组时,JVM 可能会因内存不足错误而失败。

也就是说,如果 HashMap 真的很糟糕(填充的桶太多),则 HashMap 不需要分配或重新分配大数组,因为键分布不均,它会分配更多 TreeMapLists节点取决于密钥的性质。

【讨论】:

  • 这不是大多数人所理解的“容量”。这是 capacity 构造函数参数的上限,但不是最大条目数。
【解决方案3】:

capacity 参数为实现其内部表的 initial 大小提供了提示。这可以节省一些内部调整大小。

但是,除非 JVM 遇到 OutOfMemoryError,否则 HashMap 不会停止接受 put()s。

实际上,hashmap 是一个数组。哈希用作数组索引。每个数组元素都是对Entry 对象的链表的引用。链表可以任意长。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多