检查Hashtable是否是完整的java

时间:2016-06-01 10:49:20

标签: java hashtable capacity

如主题所述,我如何检查Hashtable是否已满(如果可以完全执行此操作)?

有:

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

我想象一个人需要使用,例如

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

我发现某个地方的哈希表是使用默认大小11创建的,并且如果需要,它们的容量会自动增加...所以最后,Hashtable可以满了吗?

3 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:4)

  使用默认大小11

创建

Hashtable

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

显然,一个包含11个散列桶的表可以容纳少于而不是11个项目。也许不那么明显,根据正在使用的collision resolution,一个包含11个桶的表也可以容纳更多而不是11个项目。

  

Hashtable可以满员吗?

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

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

答案 2 :(得分:0)

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

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

在封面下,散列图是一个数组。哈希用作数组索引。每个数组元素都是对Entry个对象的链接列表的引用。链表可以任意长。