如主题所述,我如何检查Hashtable是否已满(如果可以完全执行此操作)?
有:
HashMap<Integer, Person> p = new HashMap <>();
我想象一个人需要使用,例如
if (p.size()>p "capacity"==true)
我发现某个地方的哈希表是使用默认大小11创建的,并且如果需要,它们的容量会自动增加...所以最后,Hashtable可以满了吗?
答案 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就不需要分配或重新分配大数组,因为密钥分布不好,它会分配更多TreeMap
或Lists
个节点,具体取决于密钥的性质。
答案 1 :(得分:4)
使用默认大小11 创建
Hashtable
这不是HashTable
的大小,而是它拥有的哈希桶的数量。
显然,一个包含11个散列桶的表可以容纳少于而不是11个项目。也许不那么明显,根据正在使用的collision resolution,一个包含11个桶的表也可以容纳更多而不是11个项目。
Hashtable
可以满员吗?
这取决于实施。使用单独链接的哈希表(例如Java HashMap
)无法填满,即使它们的所有存储桶都已耗尽,因为我们可以继续向每个存储桶的各个链添加项目。但是,使用太少的散列桶会导致性能显着下降。
另一方面,具有线性探测的哈希表,例如Java IdentityHashMap
(严格来说,它不是一个有效的基于哈希的容器),当你用完时,可以填满桶中。
答案 2 :(得分:0)
capacity
参数提供了对其内部表的初始大小的实现的提示。这可以节省一些内部调整大小。
但是,除非JVM遇到put()
,否则HashMap不会停止接受OutOfMemoryError
。
在封面下,散列图是一个数组。哈希用作数组索引。每个数组元素都是对Entry
个对象的链接列表的引用。链表可以任意长。