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

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

3个回答

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

我觉得楼主你采纳的有问题。把上面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

MrAmity
MrAmity 你说的对,我感觉我回答的有点驴头不对马嘴
2 个月之前 回复

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

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

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
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算法复杂度为什么为O(1)
[code=&quot;java&quot;] containsKey的复杂度是O(1),它是直接根据给定的参数key来计算hashcode,看看相关位置上是否有。如果相关位置已被占用,就继续寻找下一个位置。下面是JDK实现containsKey的主要代码: int hash = hash(k); int i = indexFor(hash, table.length); ...
关于把HashMap设置成静态变量的问题
我现在需要在一个类里面放一个HashMap,往里面放一些数据,每次要从数据库中取数据的时候先查找HashMap,看是否已经存在,若存在就直接提取,若不存在就从数据库中抽取数据之后再放到HashMap中,那是否应该把HashMap设置为类的静态变量啊?rnrn若这样设置public static HashMap hmData ;就无法往hmSpace 中加入数据了,是否应该New一个对象呢?rnrn请高手指点!!!!解决问题一定给分!!!谢谢!!!
为什么要设置成全局变量
private EditText editText;rn private TextView textViewTwo;rn @Overridern protected void onCreate(Bundle savedInstanceState) rn super.onCreate(savedInstanceState);rn setContentView(R.layout.second);rn TextView textView = (TextView)findViewById(R.id.shengao);rn Bundle bundel = getIntent().getExtras();rn Double doub = bundel.getDouble("editText");rn textView.setText(doub.toString());rn editText = (EditText)findViewById(R.id.shisi);rn textViewTwo = (TextView)findViewById(R.id.shisixianshi);rn editText.setOnKeyListener(new EditText.OnKeyListener() rn rn @Overridern public boolean onKey(View v, int keyCode, KeyEvent event) rn // TODO Auto-generated method stubrn textViewTwo.setText(editText.getText().toString());rn Log.v("nothing", editText.getText().toString());rn return false;rn rn rn );rnrnrn private EditText editText;rn private TextView textViewTwo;设置成全局变量 setOnKeyListener才能监控到,放在onCreate就不能监控到rn
Java源码阅读之HashMap(1)
表结构的第一部分,HashMap。 /** * HashMap是基于Map接口的实现类,允许克隆和序列化操作。 * HashMap是非线程安全的,键和值都允许为null,但是键为null的键值对会被放在最前面。 * HashMap不能保证存储的键值对的顺序是一直保持不变的。 * HashMap的操作性能与两个因素有关,桶的大小和负载因子的大小,为了保证性能,请不要负载因子设置的过
1、HashMap排序
1、问题已知一个HashMap< Integer,User>集合,User有 name(String) 和 age(int) 属性,请写一个方法实现对HashMap的排序功能。该方法接收HashMap< Integer,User>为形参,返回类型为HashMap< Integer,User>,需要对HashMap中的User的age进行排序,排序中key:value键值对不能拆开。tips:Link
每日一题-1(HashMap)
今天开始刷刷leetcode 每天记录一下吧 1.题目 题目看着还是挺简单 首先想到的方法肯定是一个二重循环 但是此方法时间复杂度为 O(n^2) 空间复杂度空间复杂度:O(1) public int[] twoSum(int[] nums, int target) { for (int i = 0; i &lt; nums.length; i++) { for (int ...
HashMap的详细介绍(1)
HashMap的详细介绍 —–本文只针对1.7版本的HashMap所讲解. HashMap是java里面以Key-value存储的一种集合对象,它使用的是数组加上链表的结构,它允许key和value为null,是一种无序并且线程不安全的集合对象。现在我们开始详细介绍下它的工作流程. HashMap它有四种构造方法,如下图所示: //两个参数的构造方法,传入的是初始容量,加载因子 pub
hashmap深入原理分析-1
第一周:n内容包括,Java环境搭建,变量,数据类型,二进制,if/else,switch,for,while,do while等基础语法内容n n第二周:n讲解数组及面向对象的相关技术,封装,继承,多态,还有面向对象的实战讲解n n第三周:n讲解集合及IO流,这两项在后期的项目开发中尤其重要,在面试中也占有非常重要的比重n n第四周:n讲解异常,多线程,网络编程,内存分析,内部类
JDK8 源码之HashMap(1)
Map(附录有详细介绍)为一个将键映射到值的对象。一个映射不能包含重复的键;每个键最多只能映射到一个值。 HashMap在jdk1.8中,实现上有了一个很大的优化,实现方式有原来的数组加链表,变成了数组、链表和红黑树。在性能上有了一个较大的提升,也一定程度上解决了hash值碰撞带来的性能损失。
HashMap原理分析1
1.继承关系 HashMap是继承AbstractMap抽象类,实现了Map接口,接下来先分析这几个父类: 1.1 Map&lt;K,V&gt; map是key=value这种存储数据格式的接口,他定义了map的基本操作方法,以及存储的数据格式 Entry&lt;k,V&gt; public interface Map&lt;K,V&gt; { //获取容器存的键值对数量 int siz...
深入了解HashMap(1)
深入了解 HashMap, 代表小生对 HashMap 的是用过程中的一些分析与见解, 如果有不准确的地方还希望批评指正.
HashMap源码学习1
日常业务代码编辑中,HashMap基本每天都会使用到,花了点时间仔细看了下HashMap的源码,并在网上找了些大牛的博客帮助理解。写点东西,记录下自己的学习过程。 一,构造HashMap 使用HashMap之前,首先我们要new一个出来,如下: Map map = new HashMap(); 这里通过构造函数new了一个HashMap,那么这个构造函数里面究竟发生了什么?看源码
hashmap源码分析1
之前看过hashmap源码,感觉最近有些遗忘,写一波复习一遍,首先查看hashmap的继承体系,可以发现hashMap实现了map,cloneble,serializable接口这些接口应该都很熟悉了吧,其次hashmap继承自abstractmap查看这个父类,发现他是一个抽象类,因此其中有些方法是可以复写的,具体方法查看源码可以发现包括entrySet其他方法可以看做map这种数据结构都通用的
java 数据结构(1)————HashMap
HashMap算是Java集合框架中使用最普遍的,对于他的基本特性和使用方法都知道了解,但是他的底层实现却很少去了解,也很少关注。最近空闲在网上找了很多关于这方面的帖子和博客,综合总结一下。https://blog.csdn.net/UzV80PX5V412NE/article/details/78591134https://www.cnblogs.com/chengxiao/p/6059914....
Java详解(1):HashMap介绍,HashMap的迭代,HashMap的线程安全问题
Java详解(1):HashMap的实现与注意事项 本系列是Java详解,专栏地址:
for i=30 to 1 step -1 为什么不能执行
private sub form_click()rndim i as bytern for i=30 to 1 step -1 rn msgbox "这是第"&i&"回合"rnnext irnend subrn我在执行该程序时出现溢出的错误!rn请帮我解决,谢谢up有分
HashMap为什么不是线程安全的
一、扩容过程 我们知道,HashMap在扩容的时候,是通过重新创建一个新的hash表,把原来旧数组中的Entry一个个迁移到新数组的,这个过程的实现方法如下 void transfer(Entry[] newTable) { Entry[] src = table; int newCapacity = newTable.length; ...
HashMap为什么线程不安全?
put操作不安全 resize操作不安全 put操作不安全 首先,我们都知道,HashMap的底层,是由一个Entry数组维护,数组中的每一个元素都存放着一个链表。当多线程情况下,我们进行put操作,例如: 线程A: map.put(&amp;amp;quot;1&amp;amp;quot;,A); 线程B: map.put(&amp;amp;quot;1&amp;amp;quot;,B); 我们可以看到线程A、B分别进行了Put操作,经过hash计算之后,他们的key相同,...
为什么hashMap线程不安全
转自:https://www.jianshu.com/p/e2f75c8cce01
HashMap为什么不是线程安全的?
大家都知道,HashMap的结构是如下的样子: 上面的是HashMap的存储数据结构,通过给Map的key计算hash值,然后决定value放到数组的对应索引位置上,这样就可以通过计算key的hash值,直接去数组中拿到value(所以HashMap是O(1)的复杂度)。 当key冲突(不同的key生成的hash值是 相同的)的时候,就需要把多个value放到同一个位置,这时候,jdk1....
HashMap为什么树化
在JDK1.8中,HashMap做了一些改变: JDK1.7中,发生哈希碰撞时,将键值对添加到链表头部,JDK1.8是将键值对添加到链表尾部。 JDK1.8中,如果链表的长度超过8,将会将链表转化为红黑树。 容量的初始化:JDK1.7的HashMap在构造时会对容量进行初始化,而JDK1.8是在首次向HashMap总中执行put操作时,对容量进行初始化,也就是说,JDK1.8的HashMap...
HashMap为什么线程不安全
HashMap的线程安全问题体现在以下3个方面: 1、线程1调用contains()返回true,然后调用get(),同时线程2调用remove() 2、2个线程执行put操作: 线程1put()时,记录了头结点为node1,这时时间片用完,线程2put(),且把数据插在了链表的头部,完成put操作。线程1接着完成put()剩余的操作,这时新的头结点已经变了,但是线程1记录的旧的头结点,把数据插入...
HashMap为什么不是线程安全?
前言 该试题从互联网获得,真实性没有考究,加上本人学识浅薄,所以面试题参考为主,解析分享为主。 若对解析有不同看法,还请评论指正。谢谢。 HashMap为什么不是线程安全? 以JDK1.8的HashMap为例,引用作者: 一字马胡 所写文章中的一张图: 上图为 ...
30天自制操作系统1
30天自制操作系统附带光盘中所有源码,这是1-15天的源码。
30天自制操作系统-1
    因为前面看完了这本书, 所以准备花一些时间整理一下这本书(有空就写写),一开始在打算写一个&quot;操作系统&quot;的时候有两个打算,一个是于渊先生的《Orange's一个操作系统的实现》,另一个就是这本《30天自制操作系统》,这两个系统的区别是前者是类似Linux系统的命令行后者是图形界面,基于我对学习Windows内核的渴求(基本上不可能...万恶的商业软件),所以我选择了后者。    在开始之前需...
80分(1:20 2:30 3:30)
1:java不能产生.exe吗?rn2:为什么String可以用String str = "my string"或String str = new String("my string"),而StringBuffer只能用后一种?rn3:StringTokenizer中的nextToken和nextElement区别?rn
30天自制操作系统-1
第一天,算是正式开始了,这一天我们在前面部分会做出一个在完全没有任何操作系统的基础上打印一句话。但是我们不会写任何一句代码。而是利用一个工具,一个二进制的工具。在这里讲一个故事, 不过是个假的故事,但理论上却又可行。据说啊,某天深夜,女神电脑坏了,找到了旁边的程序员小哥哥,需要重装,不过恰巧这时候没有下载操作系统,那咋办呢,于是那个程序员...
30 宠物商店绘制1
跟一夫学UI设计 APPUI图标设计实战案例视频教程 photoshop cs6绘制icon案例; app Ui 图标 icon 绘制 色彩,移动端图标绘制,游戏图标绘制等。
30天自制操作系统(1)
看了大半个月的自制操作系统,终于想起来也做一个,要不然还真对不起自己曾经去过的ISC2015……
为什么short_open_tag设置成On仍无效
配置php遇到个坑爹问题,由于别个写的代码用到了短标签格式,linux默认是关闭的,我用vim,直接搜索short,找到了第一个,直接把;去掉改成on,居然发现不生效,再确定配置文件正确读取后。又仔细看了下,发现下面还有一个short_open_tag=off,彻底无语,这种文件都是顺序执行的,下面覆盖上面的。so,这是个很尴尬的问题
Java HashMap实现原理1——散列表
这是HashMap系列博文的第二篇,在上一篇讲了hashCode、equals等方法的用途后,再带大家看下HashMap的数据结构——散列表,一步步地靠近HashMap的最终实现。
重复造轮子(1) --- 手写HashMap
手写Hashmap代码:首先我们需要了解jdk里面hashmap的源码部分,如果对于hashmap的源码有了解的朋友,就应该会知道hashmap里面的这段代码: 是的,这是一段经典的node节点代码,我们可以吧hashmap看成一个存储单向链表的数组,然后每个链表里面的元素都是包含有相应的k v值。参考源码的内容,我写了一小段自己关于hashmap的设计代码:首先是一个父类接口的设计:/** *...
Java源码集合类HashMap学习1
Java中集合类HashMap是存储键值(key,value)对为元素的集合,键和值都是以类类型来存储,通过键(key)来获得对应的值(value)。使用HashMap集合最大的一个优点是查询值(value)的速度快。                 为什么集合HashMap查询值的速度快呢?这里就要涉及到HashMap的底层实现,用了数据结构哈希表(hash table)。对与哈希表的实现原理
Map 接口,HashMap常用方法 (1)
Map 就是用来存储 “键(key)-值(value)对”,Map 类中存储的“键值对”通过键来标识,所以键值对不能重复, Map 接口的实现类有HashMap, TreeMap, HashTable,  Preperties等 package com.jianshun; import java.util.HashMap; import java.util.Map; /** * 测试Ha...
HashMap源码分析与哈希表实现原理(1)
此阶段能掌握java基础语法,面向对象思想,抽象类,接口,异常,集合,IO流,文件处理,多线程,网络编程,eclipse的使用等java基础课程,给刚入门的小白提供直接跨入java领域的时空隧道。
1、说说Hashtable和HashMap的区别
笔试面试题目搜集整理【每日增加】 1、说说Hashtable和HashMap的区别   【答案】 (1).HashMap 类没有分类或者排序。它允许一个 null 键和多个 null 值。 (2).Hashtable 类似于 HashMap,但是不允许 null 键和 null 值。它也比 HashMap 慢,因为它是同步的,线程安全的。 (3).Hashtable继承自Dicti...
并发的HashMap为什么会引起死循环?
今天研读Java并发容器和框架时,看到为什么要使用ConcurrentHashMap时,其中有一个原因是:线程不安全的HashMap, HashMap在并发执行put操作时会引起死循环,是因为多线程会导致HashMap的Entry链表形成环形数据结构,查找时会陷入死循环。纠起原因看了其他的博客,都比较抽象,所以这里以图形的方式展示一下,希望支持! (1)当往HashMap中添加元素时,会
HashMap的负载因子为什么是0.75
有没有具体一点的说法,看有的说法是大了会增加碰撞率,小了会浪费资源,这个是根据什么来判断的呢?
HashMap为什么重新计算hash值
一:大致的回答hashMap是一个存储key-value键值对的集合,每个键值对称为一个entity,这些entity分散存储到一个数组中,这个数组就是hashMap的主干,我们通过一个hash函数得到一列二进制数去与(数组长度-1)去&amp;amp;,得到index数组下标位置,然后put数组中去,当我们长度改变,肯定要重新计算hash值二:进一步深问2.1:hashMap的初始长度为多少    主干...
相关热词 c++和c#哪个就业率高 c# 批量动态创建控件 c# 模块和程序集的区别 c# gmap 截图 c# 验证码图片生成类 c# 再次尝试 连接失败 c#开发编写规范 c# 压缩图片好麻烦 c#计算数组中的平均值 c#获取路由参数