为什么增大HashMap容器类里的加载因子 会增加查询数据的时间开销
当创建HashMap时,有一个默认的负载因子(loadfactor),其默认值为0.75,这是时间和空间成本上一种折衷:增大负载因子可以减少Hash表(就是那个Entry...
当创建 HashMap 时,有一个默认的负载因子(load factor),其默认值为 0.75,这是时间和空间成本上一种折衷:增大负载因子可以减少 Hash 表(就是那个 Entry 数组)所占用的内存空间,但会增加查询数据的时间开销,而查询是最频繁的的操作(HashMap 的 get() 与 put() 方法都要用到查询);减小负载因子会提高数据查询的性能,但会增加 Hash 表所占用的内存空间。
上面说的我不明白为什么增大加载因子 会增加查询数据时间的开销 求解 展开
上面说的我不明白为什么增大加载因子 会增加查询数据时间的开销 求解 展开
2个回答
展开全部
建议你查看一下散列表一些规则,负载因子表示散表的装满程度,如果是增大了负载因子的话,就代表这个散列表装的越满,这个越满代表了什么,代表了hash表的空间越少,所以往里面put或者get的时候经常会出现散列值的冲突问题,举个例子,在放数据的时候,如果求到了一个散列值了,准备放的时候,发现hash表在那个位置有数据了,那就得往后查找,如果找个空间很小,很可能之前就已经放过值了。。又得往后,是不是浪费时间,如果第一次放的时候就有足够的空位置呢?也就是说如果散列表够大,求出来的散列值不存在冲突,是不是可以直接放进去了?查找同理
展开全部
我新建一个HashMap,初始容量为16。
我存入一个对象,则会先取其hashcode,
然后在把hashcode经过某种indexFor运算,得出0-15之间的一个数字。
例如我
存入Object1 存到下标0;
存入Object2 存到下标7;
存入Object3 存到下标4;
存入Object4 恰好也是7,怎么办呢,发生了碰撞?
Hashmap的做法是把Object2和4组成一个链表,然后在放在下标7的位置。
由此我们知道负载因子越大,发生碰撞的可能性越大。
我们知道hash操作和indexFor运算的速度都很快,
可是对于链表的查询(只能一个一个的比较)比Hash查询慢多了。
所以负载因子越大,则查询速度越慢。负载因子越小,则空间浪费越大。
我存入一个对象,则会先取其hashcode,
然后在把hashcode经过某种indexFor运算,得出0-15之间的一个数字。
例如我
存入Object1 存到下标0;
存入Object2 存到下标7;
存入Object3 存到下标4;
存入Object4 恰好也是7,怎么办呢,发生了碰撞?
Hashmap的做法是把Object2和4组成一个链表,然后在放在下标7的位置。
由此我们知道负载因子越大,发生碰撞的可能性越大。
我们知道hash操作和indexFor运算的速度都很快,
可是对于链表的查询(只能一个一个的比较)比Hash查询慢多了。
所以负载因子越大,则查询速度越慢。负载因子越小,则空间浪费越大。
本回答被提问者和网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询