HashMap MAXIMUM_CAPACITY 为什么设置成1 << 30

正在学习hashmap,发现他的最大扩容数量是 1 << 30
但是为什么设置为这个呢。
请大牛指点

0

3个回答

因为hashmap中定位位置用的是hash&(length-1),只有数组长度为2的n次,hash%length=hash&(length-1)
,2的n次-1的二进制表示刚好全为1,这样&运算能分布均匀,不然如果有一位是0,那么与运算结果对应的这一位也永远是0,那就对应的数组
为空,分布不均匀了

0

就是表示一个很大的数字,int一般都不会超过的
int总共4字节,最高位是符号位,如果写成(1<<31)就变成负数了
如果你无聊的话,可以定义成0x7fffffff,这个是int能表示的最大数字

基础知识还是要了解一下吧

1

我觉得楼主你采纳的有问题。把上面2个答案结合起来会好一点。为什么是1 << 30因为2个因素造成的。
1. 正如上楼的 MrAmity 所说,HashMap在确定数组下标Index的时候,采用的是( length-1) & hash的方式,只有当length为2的指数幂的时候才能较均匀的分布元素
。所以HashMap规定了其容量必须是2的n次方

2.由于HashMap规定了其容量是2的n次方,所以我们采用位运算<<来控制HashMap的大小。使用位运算同时还提高了Java的处理速度。
HashMap内部由Entry[]数组构成,Java的数组下标是由Int表示的。所以对于HashMap来说其最大的容量应该是不超过int最大值的一个2的指数幂,
而最接近int最大值的2个指数幂用位运算符表示就是 1 << 30

0
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
HashMap深度解析(二)
       本文来自:高爽|Coder,原文地址:http://blog.csdn.net/ghsau/article/details/16890151,转载请注明。        上一篇比较深入的分析了HashMap在put元素时的整体过程,Java Collections Framework中实际操作的都是数组或者链表,而我们通常不需要显示的维护集合的大小,而是集合类框架中内部维护,方便的同...
HashMap源码注解 之 常量定义(一)
注意 ,本文基于JDK 1.8 1.默认容量/** * The default initial capacity - MUST be a power of two. */ static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // aka 16默认初始化的容量为16,必须是2的幂。 2.最大容量 /** * The maximu
HashMap的容量与扩容
有几个重要的常量: static final int DEFAULT_INITIAL_CAPACITY = 1 4;//默认的桶数组大小 static final int MAXIMUM_CAPACITY = 1 30;//极限值(超过这个值就将threshold修改为Integer.MAX_VALUE(此时桶大小已经是2的31次方了),表明不进行扩容了) static final floa
HashMap的最大容量为什么是2的30次方(1左移30)?
文章目录引言探究过程1 -- 为什么是30探究过程2 -- 为什么是 1 &amp;amp;lt;&amp;amp;lt; 30总结 引言 在阅读hashmap的源码过程中,我看到了关于hashmap最大容量的限制,并产生了一丝疑问。 /** * The maximum capacity, used if a higher value is implicitly specified * by either ...
HashMap的详细介绍(1)
HashMap的详细介绍 —–本文只针对1.7版本的HashMap所讲解. HashMap是java里面以Key-value存储的一种集合对象,它使用的是数组加上链表的结构,它允许key和value为null,是一种无序并且线程不安全的集合对象。现在我们开始详细介绍下它的工作流程. HashMap它有四种构造方法,如下图所示: //两个参数的构造方法,传入的是初始容量,加载因子 pub
HashMap源码注解 之 静态工具方法hash()、tableSizeFor()(四)
注意 , 本文基于JDK 1.8 HashMap#hash() 为什么要有HashMap的hash()方法,难道不能直接使用KV中K原有的hash值吗?在HashMap的put、get操作时为什么不能直接使用K中原有的hash值。 /** * Computes key.hashCode() and spreads (XORs) higher bits of ha...
Jdk1.7 HashMap源码分析与思考
Jdk1.7 HashMap源码分析解读HashMap类图新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 Ha...
【Java学习】从源码层面彻底搞懂HashMap(Java8)
一、属性 //默认初始容量 static final int DEFAULT_INITIAL_CAPACITY = 16; //最大容量 static final int MAXIMUM_CAPACITY = 1073741824; //默认加载因子,当插入,MAXIMUM_CAPACITY/DEFAULT_LOAD_FACTOR(最大/加载因子)此时就该扩容了,加载因子越大空间利用越多。
ConcurrentHashMap构造函数解析以及字段,存储结构类
一:字段解析(大部分):       // node数组最大容量:2^30=1073741824 private static final int MAXIMUM_CAPACITY = 1 &amp;lt;&amp;lt; 30; // 默认初始值,必须是2的幕数 private static final int DEFAULT_CAPACITY = 16; //数组可能最大值,需要与toArra...
HashMap中tableSizeFor的一个精巧的算法
代码如下: 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; re
HashMap负载因子
下面是HashMap的一个构造函数,两个参数initialCapacity,loadFactor这关系HashMap的迭代性能。 1 /** 2 * Constructs an empty &amp;lt;tt&amp;gt;HashMap&amp;lt;/tt&amp;gt; with the specified initial 3 * capacity and load factor. 4 ...
关于 HashMap 1.8 的重大更新
目录 1. 简介 类定义 public class HashMapK,V> extends AbstractMapK,V> implements MapK,V>, Cloneable, Serializable123 主要简介 HashMap 的实现在 JDK 1.7 和 JDK 1.8 差别较大今天,我将对照
HashMap:为什么容量总是为2的次幂
HashMap:为什么容量总是为2的次幂 HashMap是根据key的hash值决策key放入到哪个桶(bucket)中,通过 tab=[(n - 1) &amp;amp;amp;amp;amp;amp;amp;amp; hash] 公式计算得出。 其中tab是一个哈希表 1)为什么要通过 (n - 1) &amp;amp;amp;amp;amp;amp;amp;amp; hash 决定桶的索引呢? (1)key具体应该在哪个桶中,肯定要和key挂钩的,HashMap顾名思义就是通过hash算法高效的把存储
java集合框架分析-HashMap(加载因子及初始容量深入分析)
《java集合框架分析-HashMap》 一文对 Java 的 HashMap 进行了简单分析,本篇继续深入了解其中涉及到的一些重要内容。源码环境 JDK1.6
java集合之HashMap的扩容resize
JDK1.7中,resize时,index取得时,全部采用重新hash的方式进行了。JDK1.8对这个进行了改善。 以前要确定index的时候用的是(e.hash & oldCap-1),是取模取余,而这里用到的是(e.hash & oldCap),它有两种结果,一个是0,一个是oldCap, 比如oldCap=8,hash是3,11,19,27时,(e.hash & oldCap)的结果
为什么HashMap初始大小为16,为什么加载因子大小为0.75,这两个值的选取有什么特点?
内容转自:https://blog.csdn.net/Dazhu233/article/details/79596584 1、先看HashMap的定义: public class HashMap&amp;lt;K,V&amp;gt;extends AbstractMap&amp;lt;K,V&amp;gt; implements Map&amp;lt;K,V&amp;gt;, Cloneable, Serializable HashM...
HashMap使用时的 initialCapacity 参数的问题
-
hashmap算法复杂度为什么为O(1)
[code=&quot;java&quot;] containsKey的复杂度是O(1),它是直接根据给定的参数key来计算hashcode,看看相关位置上是否有。如果相关位置已被占用,就继续寻找下一个位置。下面是JDK实现containsKey的主要代码: int hash = hash(k); int i = indexFor(hash, table.length); ...
HashMap的时间复杂度是O(1)
今天在面试的时候说到HashMap,面试官问了这么一个问题:你说HashMap的get迭代了一个链表,那怎么保证HashMap的时间复杂度O(1)?链表的查找的时间复杂度又是多少? 在这之前我是阅读过HashMap的源码的:Java7源码浅析——对HashMap的理解 由上一个博客...
HashMap源码注解 之 resize()方法(七)
注意 ,本文基于JDK 1.8 HashMap#resize() /** * Initializes or doubles table size. If null, allocates in * accord with initial capacity target held in field threshold. * Otherwise,...
HashMap最大容量为什么是2的32次方
//默认的桶数组大小 static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; //极限值(超过这个值就将threshold修改为Integer.MAX_VALUE(此时桶大小已经是2的31次方了),表明不进行扩容了) static final int MAXIMUM_CAPACITY = 1 << 30; //负载因子(请阅读下面体会这个值的用处) s
面试中关于HashMap的时间复杂度O(1)的思考
关于HashMap的时间复杂度的思考
java中hashmap容器实现查找O(1)时间复杂度的思考
我一直有个疑问,为什么hashmap能够实现O(1)的查找复杂度。。纵使其存储了一些键值对,那也只能保证你找到了key值之后,能够在O(1)事件内查询到value值。。而我的疑问是,怎么保证key值的查找也在O(1)事件内完成。而这也是整个hashmap中最关键的问题。 一、理解: 通过阅读jdk的源码,我对该问题的理解如下: 我们知道hashmap在存储键值对时借助了“数组+链表”的方式。
HashMap为何要通过构造函数指定容量
本来想写一篇关于HashMap完整的源码分析的,结果我发现整理了一下东西是真的多,而且也怕误人子弟,那就分析一下为什么阿里Java开发手册里为要指定HashMap的容量吧。 让我们带着问题进入: 为什么要使用构造函数指定HashMap的容量 如果不指定会对效率造成多大的影响 其他的关于HashMap可以说的东西太多了,今天就根据阿里开发手册做一个探讨。 首先贴出阿里开发手册1.4关于Has...
深入分析hashmap
一、传统 HashMap的缺点 (1)JDK 1.8 以前 HashMap 的实现是 数组+链表,即使哈希函数取得再好,也很难达到元素百分百均匀分布。 (2)当 HashMap 中有大量的元素都存放到同一个桶中时,这个桶下有一条长长的链表,这个时候 HashMap 就相当于一个单链表,假如单链表有 n 个元素,遍历的时间复杂度就是 O(n),完全失去了它的优势。 (3)针对这种情
关于hashMap的容量为什么是2的幂次方的最详细解析
       最近在看集合的源码,看到hashMapd的源码的时候,发现hashMap的容量都是2的幂次方(源码是通过左移运算),于是好奇为什么要这样设计,所以上网查阅了相关资料,但是发现很多资料讲的都不是很清楚,也不是很好理解,所以自己在理解的基础上做了自己的总结,希望我的总结能帮到读者更好的理解这个问题。当然,前提是读者要知道hashMap的数据结构,不然就没法理解我下面的总结,关于hashM...
Hashmap的容量为什么是2的幂次
做为面试常考的问题之一,每次都答的模模糊糊,有必要了解一下,首先来看一下hashmap的put方法的源码 public V put(K key, V value) { if (key == null) return putForNullKey(value); //将空key的Entry加入到table[0]中
HashMap深度解析(一)
HashMap可以说是Java中最常用的集合类框架之一,是Java语言中非常典型的数据结构,我们总会在不经意间用到它,很大程度上方便了我们日常开发。在很多Java的笔试题中也会问到,最常见的,“HashMap和HashTable有什么区别?”,这也不是三言两语能说清楚的,这种笔试题就是考察你来笔试之前有没有复习功课,随便来个快餐式的复习就能给出答案。
Java:手把手带你源码分析 HashMap 1.7
前言 HashMap 在 Java 和 Android 开发中非常常见 今天,我将带来HashMap 的全部源码分析,希望你们会喜欢。 本文基于版本 JDK 1.7,即 Java 7 关于版本 JDK 1.8,即 Java 8,具体请看文章Java源码分析:关于 HashMap 1.8 的重大更新 目录 1. 简介 类定...
为什么hashMap的负载因子是0.75
https://blog.csdn.net/zz18435842675/article/details/80928805
Java编程:浅析 HashMap 中数组的 size 为什么必须是 2 的整数次幂
直入主题:HashMap 中数组的 size 必须是 2 的幂,是为了将 key 的 hash 值均匀的分布在数组的索引上,下面我们来进行分析。如有不正之处,欢迎批评指正。HashMap 中使用 indexFor 方法来计算 key 所在的数组的索引,实现逻辑为 key 的 hash 值与数组的长度值减 1 进行与运算,代码如下: /** * Returns index for ha
HashMap的长度为什么设置为2的n次方
1. 构造函数中控制长度必须为2的n次方.首先在构造方法中, 有下面这段代码, 其中initialCapacity是我们传入的自定义map容量大小(如果不设置, 默认是16) 如果我们自定义容量, 会执行下面这段代码 : initialCapacity = 8, 这样capacity = 1, 要向左移动3次, 刚开始移动之前capacity=1, 根据移位运算, 移
关于如何解决HashMap线程安全问题的介绍
HashMap为什么是线程不安全的?如何解决HashMap的线程不安全问题?
HashMap与加载因子(负载因子loadFactor)
HashMap与加载因子(负载因子loadFactor)
java HashMap在不发生冲突的情况下get(key)时间复杂度是o(1)
HashMap在不发生冲突的情况下时间复杂度是o(1) 今天上课,老师布置了一道java题
JDK1.7中HashTable的hash为什么对素数求余,而不像HashMap中一样对2的N次方求余?
常用的hash函数是选一个数m取模(余数),这个数在课本中推荐m是素数,但是经常见到选择m=2^n,因为对2^n求余数更快,并认为在key分布均匀的情况下,key%m也是在[0,m-1]区间均匀分布的。但实际上,key%m的分布同m是有关的。证明如下:key%m = key - xm,即key减掉m的某个倍数x,剩下比m小的部分就是key除以m的余数。显然,x等于key/m的整数部分,...
Java HashMap 源码解析 (一)
数据结构:首先,回顾ArrayList和LinkedList底层实现分别是数组和链表:数组查询快,因为数组查询是由数组下标,并且存储在内存是连续存储的,要删除一个数据,那他后面的数据都需要向前移位。链表增删快,是因为链表物理存储上是可以是离散的,它里面有一个地方专门存储next,指向下一个数据,直接修改指向即可。HashMap的大致存储结构下面我们看一下HashMap在进行存数据的时候都发生了什么...
HashMap 扩容 加载因子
HashMap: public HashMap(int initialCapacity, float loadFactor) { //初始容量不能 if (initialCapacity ) throw new IllegalArgumentException("Illegal initial capacity: " + i
java hashmap的加载因子
加载因子是表示Hsah表中元素的填满的程度.若:加载因子越大,填满的元素越多,好处是,空间利用率高了,但:冲突的机会加大了.反之,加载因子越小,填满的元素越少,好处是:冲突的机会减小了,但:空间浪费多了. 冲突的机会越大,则查找的成本越高.反之,查找的成本越小.因而,查找时间就越小. 因此,必须在 &quot;冲突的机会&quot;与&quot;空间利用率&quot;之间寻找一种平衡与折衷. 这种平衡与折衷本质上是数据结构中有名的&quot;时-...
hashMap的负载因子的大小与查询效率和内存空间的比例关系。
所以负载因子越大则散列表的装填程度越高,也就是能容纳更多的元素,元素多了,链表大了,所以此时索引效率就会降低。 反之,负载因子越小则链表中的数据量就越稀疏,此时会对空间造成烂费,但是此时索引效率高。
文章热词 机器学习教程 Objective-C培训 交互设计视频教程 颜色模型 设计制作学习
相关热词 mysql关联查询两次本表 native底部 react extjs glyph 图标 30多岁学习大数据 30岁学习大数据