HashMap的长度为什么要是2的n次方】的更多相关文章

HashMap为了存取高效,要尽量较少碰撞,就是要尽量把数据分配均匀,每个链表长度大致相同,这个实现就在把数据存到哪个链表中的算法: 这个算法实际就是取模,hash%length,计算机中直接求余效率不如位移运算,源码中做了优化hash&(length-1), hash%length==hash&(length-1)的前提是length是2的n次方: 为什么这样能均匀分布减少碰撞呢?2的n次方实际就是1后面n个0,2的n次方-1  实际就是n个1: 例如长度为9时候,3&(9-1)…
这个问题应该倒过来思考,HashMap的长度是2的N次幂,有什么优势? 在HashMap的putVal()方法中,为了确定插入元素在table[]数组中的下标位置,使用的与(&)运算来计算 如下代码 final V putVal(int hash, K key, V value, boolean onlyIfAbsent, boolean evict) { Node<K,V>[] tab; Node<K,V> p; int n, i; if ((tab = table) =…
今天看HashMap的底层实现,发现HashMap的最大容量规定为: // 最大容量(必须是2的幂且小于2的30次方,传入容量过大将被这个值替换) static final int MAXIMUM_CAPACITY = 1 << 30; 当看到 1<<30 时,对“<<” 有点模糊,当了解“<<”的用法之后,又有一个问题: int类型不是4个字节共32位吗,为什么不是 1<<31呢? 首先介绍下等号右边数字及字符的含义: 1."<…
个人理解 做下记录,不正确的地方望不吝赐教 这是hashmap初始化容量时候 对容量大小做的处理,保证初始化容量为最近的2的幂次方(JDK1.8) static final int tableSizeFor(int cap) { int n = cap - 1; n |= n >>> 1; n |= n >>> 2; n |= n >>> 4; n |= n >>> 8; n |= n >>> 16; return…
版权声明:本文出自汪磊的博客,未经作者允许禁止转载. 存储键值对我们首先想到HashMap,它的底层基于哈希表,采用数组存储数据,使用链表来解决哈希碰撞,它是线程不安全的,并且存储的key只能有一个为null,在安卓中如果数据量比较小(小于一千),建议使用SparseArray和ArrayMap,内存,查找性能方面会有提升,如果数据量比较大,几万,甚至几十万以上还是使用HashMap吧.本篇只详细分析HashMap的源码,SparseArray和ArrayMap不在本篇讨论范围内,后续会单独分析…
(1)HashMap的线程不安全原因一:死循环 原因在于HashMap在多线程情况下,执行resize()进行扩容时容易造成死循环. 扩容思路为它要创建一个大小为原来两倍的数组,保证新的容量仍为2的N次方,从而保证上述寻址方式仍然适用.扩容后将原来的数组从新插入到新的数组中.这个过程称为reHash. [单线程下的reHash]  扩容前:我们的HashMap初始容量为2,加载因子为1,需要向其中存入3个key,分别为5.9.11,放入第三个元素11的时候就涉及到了扩容. 第一步:先创建一个二倍…
这个这个...本王最近由于开始找实习工作了,所以就在牛客网上刷一些公司的面试题,大多都是一些java,前端HTML,js,jquery,以及一些好久没有碰的算法题,说实话,有点难受,其实在我不知道的很多是地方还有很多很多的知识漏洞,就像这一次写的这个,也是我在刷题的时候感觉到真的是我空缺的地方,为什么呢?因为,做多了,错多了.然而很尴尬的又是因为这个只是也是很多公司的面试题,所以索性直接写下来整理一遍. 在这里我也建议各位,牛客网不仅仅是一个找工作的station也是一个可以锻炼我们的地方,没事…
HashCode() HashMap 底层实现 HashMap 的长度为什么默认初始长度是16,并且每次resize()的时候,长度必须是2的幂次方? HashMap 死链问题 Java 8 与 Java 7对比 为什么要使用红黑树? 说说hashmap如何处理碰撞的,或者说说它的扩容? 一,简介 (1)桶(capacity)容量,即数组长度:DEFAULT_INITIAL_CAPACITY=1<<4:默认值为16,即在不提供有参构造的时候,声明的hashmap的桶容量: (2)MAXIMUM…
HashMap.HashTable.ConcurrentHashMap的原理与区别 http://www.yuanrengu.com/index.php/2017-01-17.html 2017年1月17日 夏雪冬日 Comments 3 Comments 扩展阅读:HashMap在jdk1.7和1.8中的实现 希望各位小伙伴能带着如下几个问题来进行阅读,这样收获会更大. HashTable.HashMap.ConcurrentHashMap的区别? HashMap线程不安全的出现场景? Has…
1. HashMap在什么条件下扩容 判断HashMap的数组Size大小如果超过loadFactor*capacity,就要扩容. 相关的类属性: capacity:当前数组容量,始终保持 2^n,可以扩容,扩容后数组大小为当前的 2 倍. loadFactor:负载因子,默认为 0.75 loadFactor加载因子是控制数组存放数据的疏密程度,loadFactor越趋近于1,那么 数组中存放的数据(entry)也就越多,也就越密,也就是会让链表的长度增加,loadFactor越小,也就是趋…