精华内容
下载资源
问答
  • 默认容量2<<4 因子0.75 转载于:https://www.cnblogs.com/eason-d/p/9268144.html

    默认容量2<<4 因子0.75

     

    转载于:https://www.cnblogs.com/eason-d/p/9268144.html

    展开全文
  • HashMap 负载因子

    2020-07-29 10:47:44
    文章目录HashMap 负载因子 HashMap 负载因子 static final float DEFAULT_LOAD_FACTOR = 0.75f; 大概意思就是说,在理想情况下,使用随机哈希码,节点出现的频率在hash桶中遵循泊松分布,同时给出了桶中元素个数和...

    文章目录

    HashMap 负载因子

    static final float DEFAULT_LOAD_FACTOR = 0.75f;

    大概意思就是说,在理想情况下,使用随机哈希码,节点出现的频率在hash桶中遵循泊松分布,同时给出了桶中元素个数和概率的对照表。从上面的表中可以看到当桶中元素到达8个的时候,概率已经变得非常小,也就是说用0.75作为加载因子,每个碰撞位置的链表长度超过8个的概率达到了一百万分之一。

    在理想情况下,使用随机哈希码,在扩容阈值(加载因子)为0.75的情况下,节点出现在频率在Hash桶(表)中遵循参数平均为0.5的泊松分布。忽略方差,即X = λt,P(λt = k),其中λt = 0.5的情况,按公式:
    在这里插入图片描述
    计算结果如上述的列表所示,当一个bin中的链表长度达到8个元素的时候,概率为0.00000006,几乎是一个不可能事件。

    展开全文
  • HashMap负载因子

    2018-05-04 06:33:53
    下面是HashMap的一个构造函数,两个参数initialCapacity,loadFactor 这关系HashMap的迭代性能。 1 /** 2 * Constructs an empty <tt>HashMap</tt> with the specified initial 3 * capacity ...

    下面是HashMap的一个构造函数,两个参数initialCapacity,loadFactor

    这关系HashMap的迭代性能。

    复制代码
     1     /**
     2      * Constructs an empty <tt>HashMap</tt> with the specified initial
     3      * capacity and load factor.
     4      *
     5      * @param  initialCapacity the initial capacity
     6      * @param  loadFactor      the load factor
     7      * @throws IllegalArgumentException if the initial capacity is negative
     8      *         or the load factor is nonpositive
     9      */
    10     public HashMap(int initialCapacity, float loadFactor) {
    11         if (initialCapacity < 0)
    12             throw new IllegalArgumentException("Illegal initial capacity: " +
    13                                                initialCapacity);
    14         if (initialCapacity > MAXIMUM_CAPACITY)
    15             initialCapacity = MAXIMUM_CAPACITY;
    16         if (loadFactor <= 0 || Float.isNaN(loadFactor))
    17             throw new IllegalArgumentException("Illegal load factor: " +
    18                                                loadFactor);
    19         this.loadFactor = loadFactor;
    20         this.threshold = tableSizeFor(initialCapacity);
    21     }
    复制代码

    关于这两个参数值的设定界限:

    1. initialCapacity是map的初始化容量,initialCapacity > MAXIMUM_CAPACITY,表明map的最大容量是1<<30,也就是1左移30位,每左移一位乘以2,所以就是1*2^30=1073741824.

    2. loadFactor是map的负载因子,loadFactor <= 0 || Float.isNaN(loadFactor),表明负载因子要大于0,且是非无穷大的数字

     

    负载因子为什么会影响HashMap性能

    首先回忆HashMap的数据结构,

    我们都知道有序数组存储数据,对数据的索引效率都很高,但是插入和删除就会有性能瓶颈(回忆ArrayList),

    链表存储数据,要一次比较元素来检索出数据,所以索引效率低,但是插入和删除效率高(回忆LinkedList),

    两者取长补短就产生了哈希散列这种存储方式,也就是HashMap的存储逻辑.

    而负载因子表示一个散列表的空间的使用程度,有这样一个公式:initailCapacity*loadFactor=HashMap的容量。

    所以负载因子越大则散列表的装填程度越高,也就是能容纳更多的元素,元素多了,链表大了,所以此时索引效率就会降低。

    反之,负载因子越小则链表中的数据量就越稀疏,此时会对空间造成烂费,但是此时索引效率高

     

    如何科学设置 initailCapacity,loadFactor的值

    HashMap有三个构造函数,可以选用无参构造函数,不进行设置。默认值分别是16和0.75.

    官方的建议是initailCapacity设置成2的n次幂,laodFactor根据业务需求,如果迭代性能不是很重要,可以设置大一下。

     

    为什么initailCapacity要设置成2的n次幂,网友解释了,我觉得很对,以下摘自网友博客:深入理解HashMap

    左边两组是数组长度为16(2的4次方),右边两组是数组长度为15。两组的hashcode均为8和9,但是很明显,当它们和1110“与”的时候,产生了相同的结果,也就是说它们会定

    位到数组中的同一个位置上去,这就产生了碰撞,8和9会被放到同一个链表上,那么查询的时候就需要遍历这个链表,得到8或者9,这样就降低了查询的效率。同时,我们也可以

    发现,当数组长度为15的时候,hashcode的值会与14(1110)进行“与”,那么最后一位永远是0,而0001,0011,0101,1001,1011,0111,1101这几个位置永远都不能

    存放元素了,空间浪费相当大,更糟的是这种情况中,数组可以使用的位置比数组长度小了很多,这意味着进一步增加了碰撞的几率,减慢了查询的效率!

     所以说,当数组长度为2的n次幂的时候,不同的key算得得index相同的几率较小,那么数据在数组上分布就比较均匀,也就是说碰撞的几率小,相对的,查询的时候就不用

    遍历某个位置上的链表,这样查询效率也就较高了。

     

    resize()方法

     initailCapacity,loadFactor会影响到HashMap扩容。

    HashMap每次put操作是都会检查一遍 size(当前容量)>initailCapacity*loadFactor 是否成立。如果不成立则HashMap扩容为以前的两倍(数组扩成两倍),

    然后重新计算每个元素在数组中的位置,然后再进行存储。这是一个十分消耗性能的操作。

    所以如果能根据业务预估出HashMap的容量,应该在创建的时候指定容量,那么可以避免resize().

    展开全文
  • HashMap负载因子的理解

    2021-03-06 13:28:35
    HashMap负载因子的理解负载因子的理解当负载因子大于1 负载因子的理解 其他参数相同时, 负载因子越小,越容易扩容,越不容易冲突,但占用的空间大。 负载因子越大,越不容易扩容,越容易冲突,但查找耗时大。 负载...

    HashMap负载因子的理解

    负载因子的理解

    其他参数相同时,
    负载因子越小,越容易扩容,越不容易冲突,但占用的空间大。
    负载因子越大,越不容易扩容,越容易冲突,但查找耗时大。

    负载因子默认0.75.

    当负载因子大于1

    我们的目标是在空间和时间中进行权衡,尽量减少冲突。而当设置负载因子大于1时,储存的数量可以大于bucket的数量,那随着元素增加,必定会有冲突。可以简单理解为总共n个座位,却有大于n个人,那必定有人要挤一挤了。

    展开全文
  • HashMap与加载因子(负载因子loadFactor)
  • java hashmap 扩容因子为什么是0.75,官方给出的解释
  • HashMap的加载因子

    2021-04-14 17:56:47
    有很多东西之前在学的时候没怎么注意,笔者也是在重温HashMap的时候发现有很多可以去细究的问题,最终是会回归于数学的,如HashMap的加载因子为什么是0.75? 本文主要对以下内容进行介绍: 为什么HashMap需要加载...
  • HashMap加载因子及转红黑树探究

    千次阅读 2020-03-03 02:18:15
    HashMap加载因子及转红黑树探究 HashMap探究(二) 今天我们来探究下:负载因子为什么是0.75?为什么红黑树扩容是当链表长度>=8时扩容?Java7的hashmap扩容死锁演示与环链形成分析? 负载因子为什么是0.75? 我们...
  • 一、何为加载因子? 加载因子是表示Hsah表中元素的填满的程度.若:加载因子越大,填满的元素越多,好处是,空间利用率高了,但:冲突的机会加大了.反之,加载因子越小,填满的元素越少,好处是:冲突的机会减小了,但:空间浪费...
  • HashMap的负载因子

    千次阅读 2017-12-01 17:19:27
    下面是HashMap的一个构造函数,两个参数initialCapacity,loadFactor这关系HashMap的迭代性能。 /** * Constructs an empty &lt;tt&gt;HashMap&lt;/tt&gt; with the specified initial * capacity ...
  • HashMap负载因子为什么是0.75

    千次阅读 2020-05-04 17:20:55
    HashMap负载因子为什么是0.75? HashMap有一个初始容量大小,默认是16 static final int DEAFULT_INITIAL_CAPACITY = 1 << 4; // aka 16 为了减少冲突概率,当HashMap的数组长度达到一个...
  • HashMap加载因子为什么是0.75 如果加载因子比较大,扩容发生的频率比较低,浪费的空间比较小,发生hash冲突的几率比较大。比如,加载因子是1的时候,hashmap长度为128,实际存储元素的数量在64至128之间时间段比较多...
  • HashMap 的性能因子

    2017-12-01 09:13:51
    上一篇:自定义 hashCode()在实际应用中,当HashMap 默认的查找速度与存储速度不能满足我们的需求时,我们可以通过手工调整HashMap 来提高性能,从而满足我们对特定应用的需求。在调整HashMap 之前有一些术语首先让...
  • HashMap 负载因子为什么默认为 0.75 负载因子是和扩容机制有关的,意思是如果当前容器的容量,达到了我们设定的最大值,就要开始执行扩容操作。举个例子来解释,避免小白听不懂: 比如说当前的容器容量是16,负载...
  • HashMap的负载因子的作用

    千次阅读 2020-05-12 11:16:53
    负载因子的大小对HashMap的影响以及作用: 负载因子的大小决定了HashMap的数据密度 负载因子越大密度越大,发生碰撞的几率越高,数组中的链表越容易长,造成查询或插入时比较次数增多,性能会下降 负载因子越小,就...
  • java基础---HashMap负载因子

    千次阅读 2018-03-08 10:15:24
    这两天在看HashMap的时候,被负载因子float loadFactor搞得很晕,经过一天的研究,最后理出了自己的一点个人见解。 在HashMap的底层存在着一个名字为table的Entry数组,在实例化HashMap的时候,会输入两个参数,一...
  • ArrayList和HashMap加载因子详解

    千次阅读 2019-05-09 11:52:37
    Map map = new HashMap(10); 如果像上面这样使用默认的构造方法,初始容量被设置为10。当map 中的元素超过10个以后,会重新分配内存空间,使数组的大小增长到16。 可以通过调试看到动态增长的数量变化:10->16-&...
  • 1.loadFactor加载因子,是用来衡量 HashMap 满的程度,表示HashMap的疏密程度,影响hash操作到同一个数组位置的概率,计算HashMap的实时加载因子的方法为:size/capacity,而不是占用桶的数量去除以capacity。...
  • HashMap之负载因子

    千次阅读 2017-09-22 17:04:38
    对于 HashMap 及其子类而言,它们采用 Hash 算法来决定集合中元素的存储位置。当系统开始初始化 HashMap 时,系统会创建一个长度为 capacity 的 Entry 数组,这个数组里可以存储元素的位置被称为“桶(bucket)”,...
  • HashMap中负载因子的意义是什么?

    千次阅读 2020-05-09 16:41:35
    学习记录 HashMap中负载因子的意义是什么? HashMap具有两个重要属性: size 和 load factor HashMap的实例具有两个影响其性能的参数:初始容量(0.75f)和负载因子(load factor)。 容量是哈希表中存储桶的数量,初始...
  • HashMap

    万次阅读 2019-12-11 17:40:25
    HashMap是基于Entry数组的链表结构,在高...HashMap的默认数组大小是16,负载因子是0.75,但是实际储存大小是(16 * 0.75 = 12),当数组内元素超过12 时,就会自动扩容16 * 2,如果还是不够就16 * 2 * 2以此类推。 ...
  • 深入理解 HashMap 加载因子 loadFactor

    万次阅读 2014-10-07 13:44:23
    加载因子是表示Hsah表中元素的填满的程度.若:加载因子越大,填满的元素越多,好处是,空间利用率高了,但:冲突的机会加大了.反之,加载因子越小,填满的元素越少,好处是:冲突的机会减小了,但:空间浪费多了. 冲突的机会...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 46,446
精华内容 18,578
关键字:

hashmap因子