检查 Hashtable 是否已满 java

check if Hashtable is full java

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

拥有:

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

我想人们需要使用例如

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

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

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 个节点,具体取决于密钥的性质。

Hashtables are created with a default size 11

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

显然,具有 11 个哈希桶的 table 可以容纳 少于 的 11 个项目。也许不那么明显,一个有 11 个桶的 table 也可以容纳 比 11 个项目更多,这取决于使用的 collision resolution

can Hashtable ever be full?

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

另一方面,散列 table 具有线性探测,例如 Java 的 IdentityHashMap(严格来说,这不是一个有效的基于散列的容器) ,当你 运行 桶用完时可以装满。

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

但是,除非 JVM 遇到 OutOfMemoryError.

,否则 HashMap 不会停止接受 put()s

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