Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/384.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java HashMap中负载因子的意义是什么?_Java_Hashmap_Load Factor - Fatal编程技术网

Java HashMap中负载因子的意义是什么?

Java HashMap中负载因子的意义是什么?,java,hashmap,load-factor,Java,Hashmap,Load Factor,HashMap有两个重要属性:size和load factor。我浏览了Java文档,它说0.75f是初始负载因子。但我找不到它的实际用途 有人能描述一下我们需要设置负载系数的不同场景以及不同情况下的一些示例理想值吗?来自: 负载因子是在自动增加哈希表容量之前允许哈希表达到的满度的度量 这实际上取决于您的特殊要求,没有“经验法则”来指定初始负载系数。这一点解释得很好: HashMap实例有两个影响其性能的参数:初始容量和负载因子。容量是哈希表中的存储桶数,初始容量只是创建哈希表时的容量。负载因子

HashMap
有两个重要属性:
size
load factor
。我浏览了Java文档,它说
0.75f
是初始负载因子。但我找不到它的实际用途

有人能描述一下我们需要设置负载系数的不同场景以及不同情况下的一些示例理想值吗?

来自:

负载因子是在自动增加哈希表容量之前允许哈希表达到的满度的度量

这实际上取决于您的特殊要求,没有“经验法则”来指定初始负载系数。

这一点解释得很好:

HashMap实例有两个影响其性能的参数:初始容量和负载因子。容量是哈希表中的存储桶数,初始容量只是创建哈希表时的容量。负载因子是在自动增加哈希表容量之前允许哈希表达到的满度的度量。当哈希表中的条目数超过加载因子和当前容量的乘积时,哈希表将被重新格式化(即,重建内部数据结构),以便哈希表的存储桶数大约是存储桶数的两倍

作为一般规则,默认负载系数(.75)在时间和空间成本之间提供了良好的折衷。较高的值会减少空间开销,但会增加查找成本(反映在HashMap类的大多数操作中,包括get和put)。在设置初始容量时,应考虑map中的预期条目数及其负载系数,以尽量减少再灰化操作次数。如果初始容量大于最大入口数除以负载系数,则不会发生再灰化操作


与所有性能优化一样,最好避免过早优化(即没有瓶颈位置的硬数据)。

HashMap的默认初始容量为16,负载系数为0.75f(即当前映射大小的75%)。负载系数表示
HashMap
容量应加倍的级别


例如容量和负载系数的乘积为
16*0.75=12
。这表示将第12个键-值对存储到
HashMap
后,其容量将变为32。

实际上,根据我的计算,“完美”加载因子更接近log2(~0.7)。尽管任何小于此值的负载系数都会产生更好的性能。我想.75可能是从帽子里拿出来的

证明:

通过预测 桶是否为空。如果一个桶可能是空的,那么它可能是空的 空的超过0.5

让我们表示大小,n表示添加的键数。使用二项式 定理,桶为空的概率为:

P(0) = C(n, 0) * (1/s)^0 * (1 - 1/s)^(n - 0)
因此,如果桶的容量小于

log(2)/log(s/(s - 1)) keys
当s达到无穷大时,如果添加的键数为 P(0)=.5,则n/s快速接近对数(2):


我会选择一个表大小为n*1.5或n+(n>>1),这将给出一个没有分区的.66666~的负载系数,这在大多数系统上都很慢,特别是在硬件中没有分区的便携式系统上。

什么是负载系数? HashMap为增加其容量而耗尽的容量量

为什么使用负载系数? 默认情况下,负载系数为初始容量(16)的0.75,因此在容量增加之前,25%的存储桶将是空闲的&这使得许多新存储桶在存储桶数量增加之后立即存在,新的哈希代码指向它们

现在为什么要保留许多空闲存储桶&保留空闲存储桶对性能有什么影响? 如果将加载因子设置为1.0,那么可能会发生一些非常有趣的事情

假设您正在向hashmap添加一个hashCode为888的对象x&在hashmap中,表示hashCode的bucket是免费的,因此对象x被添加到bucket中,但是现在再次说,如果您正在添加另一个hashCode为888的对象y,那么您的对象y肯定会被添加到bucket的末尾(因为bucket只不过是存储key、value和next的linkedList实现)现在这会对性能产生影响!因为如果执行查找,您的对象y将不再出现在bucket的头部,因此所花费的时间不会是O(1)这一次,它取决于同一个存储桶中有多少个项目。顺便说一句,这称为哈希冲突&甚至在加载因子小于1时也会发生这种情况

性能、哈希冲突和加载因子之间的相关性? 较低的负载系数=更多的自由铲斗=更少的碰撞机会=高性能=高空间要求


如果我有什么地方错了,请纠正我。

如果桶太满了,那么我们必须仔细检查

一个很长的链表

这有点违背了重点

这里有一个例子,我有四个桶

到目前为止,我的哈希集中有大象和獾

这是一个很好的情况,对吗

每个元素都有零个或一个元素

现在我们将另外两个元素放入HashSet

     buckets      elements
      -------      -------
        0          elephant
        1          otter
         2          badger
         3           cat
这也不算太糟

每个铲斗只有一个元件 . 如果我想知道,这里面有熊猫吗

我可以很快地看一看1号桶,它不是

那里和

我知道它不在我们的收藏中

若我想知道里面有并没有猫,我就看看水桶

麻木的
     buckets      elements
      -------      -------
        0          elephant
        1          otter
         2          badger
         3           cat
             buckets      elements
      -------      -------
        0          elephant
        1          otter -> koala 
         2          badger
         3           cat
            buckets      elements
      -------      -------
        0          elephant
        1          otter -> koala ->alligator
         2          badger
         3           cat
          "the HashSet can automatically

        resize the number of buckets."
          buckets      elements
      -------      -------
        0          
        1          elephant
         2          cat ->dog
         3           fish
          4         
           5
                  buckets      elements
      -------      -------
        0          
        1          elephant
         2        woodchuck-> cat ->dog
         3           fish
          4         
           5