从关于 Hashtable 类的 Java 文档中,它说
作为一般规则,默认负载因子 (.75) 在时间和空间成本之间提供了良好的折衷
所以 Hashtable 的加载因子是 0.75,这意味着如果有 N 个键,Hashtable 将使用 M = N/0.75 个空格来存储它们。
在 CLRS 书中,它还介绍了负载因子 alpha。
但据我了解,CLRS 打算将 alpha 设置为大于 1,即 M = N/alpha < N。这意味着 Hashtable 可以使用 M 个插槽,其中 M < N 以便它可以节省未使用键的存储空间。
我说 M < N 可以节省存储空间,因为通常我们不知道 N 的确切值,但我们知道键的集合并使用 N 代表可能的键数。密钥的集合可能非常大,但实际使用的密钥数量非常少。所以设置 M 小于 N 可以节省存储空间。这也是为什么通常 Hashtable 不使用直接数组来映射每个 {key, value} 1:1 的原因。
但是 Java 中的 Hashtable 使用存储多于 N。我认为这与 CLRS 设计不相符,对吧?
我对吗?
谢谢