首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么HashMap默认初始容量为2?不是2会怎样?讲讲 HashMap 扰动函数

关于HashMap的详解文章请移步: 链接: HashMap源码研究——源码一行一行的注释 文章目录 为什么初始容量是 2? 如果指定了不是2的的容量会发生什么?...为什么初始容量是 2?...2的情况: 非2的情况,假设 n = 10: 对比来看,哪种发生哈希碰撞的概率更低一目了然,如果 n 为 2,可以保证数据的均匀插入,降低哈希冲突的概率,毕竟冲突越大,代表数组中的链表...总结 总的来说,不管是规定 Hashmap 的 n 为 2,还是扰动函数,都是为了一个目标,降低哈希冲突的概率,从而使 HashMap 性能得到优化。...而规定 n 为 2,是在新建 Hashmap对象初始化时,规定其容量大小的角度来优化。而扰动函数是插入 key 值时改变 key 的散列值来达到优化效果。

98421

restful 等性(什么是法则)

理解RESTful的等性,并且设计符合等规范的高质量RESTful API。 怎么理解等性 HTTP等方法,是指无论调用多少都不会有不同结果的 HTTP 方法。...不管你调用一,还是调用一百,一千,结果都是相同的。 还是以之前的博文的例子为例。...# 更新用户信息(部分字段) 【DELETE】 /users/1001 # 删除用户信息 HTTP GET方法 HTTP GET方法,用于获取资源,不管调用多少接口...我们来看下 【PUT】 /users/1001 # 更新用户信息(全部字段) 因为它直接把实体部分的数据替换到服务器的资源,我们多次调用它,只会产生一影响,但是有相同结果的...【DELETE】 /users/1001 # 删除用户信息 调用一和多次对资源产生影响是相同的,所以也满足等性。

48420
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    HashMap 容量为什么总是为 2 的

    为什么要保证 capacity 是2的呢? 1)在get方法实现中,实际上是匹配链表中的 Node[] tab 中的数据。...2)因为 n 永远是2的,所以 n-1 通过 二进制表示,永远都是尾端以连续1的形式表示(00001111,00000011) 当(n - 1) 和 hash 做与运算时,会保留hash中 后 x...3)首先要提的一点是 HashMap 中 capacity 可以在构造函数中指定,如果不指定默认是2 的 (n = 4) 次方,即16。...0 : (h = key.hashCode()) ^ (h >>> 16); } 3.capacity 永远都是 2 ,那么如果我们指定 initialCapacity 不为 2时呢,是不是就破坏了这个规则...答案是:不会的,HashMap 的tableSizeFor方法做了处理,能保证n永远都是2

    1.7K20

    实训任务—二的进阶表示

    如果上题中的大于1,则也要用2的形式输出。...2的形式,我们需要思考的问题有两点 什么时候进入递归调用 什么时候结束递归调用 这两个问题如果没有思考清楚,写完之后绝对会进入无限递归调用。...第一递归调用的时候肯定是在输入数据之后。...在往后的递归过程中每次都是判断是否大于1,大于1就把这个值再次传入函数之中,直到, 等于1或者0 第二个问题:什么时候结束递归调用 每次我们传入一个数据之后,首先计算出这个数以下最大的一个二表示数...04 后话 前面已经说过了,以后用这个公众号(jay-ztx)来发布各种文章 不仅仅是C语言,还有c++,java的学习。

    59150

    Java 实现等性:原理与实践

    在分布式系统中,等性(Idempotency)是一个非常重要的概念。等性操作指的是:无论这个操作执行多少,结果都应该是相同的。...本文将通过一些实际的代码示例,介绍在 Java 中如何实现等性,结合常见的框架如 Spring Boot、Redis 和 数据库 进行实现。 一、为什么需要等性?...二、实现等性的常见方法 在 Java 中,常见的实现等性的方法包括: 唯一请求标识(Request ID) 数据库主键约束 基于 Redis 的等性 Token 机制 1....总结 等性是分布式系统中非常重要的设计原则。在 Java 中,可以通过 唯一标识、数据库唯一约束、Redis 锁 和 Token 机制 来实现等性。...唯一请求标识 是实现等性的基础,它可以保证每个操作只执行一。 数据库的唯一约束 和 Redis 的 SETNX 是常见的等性实现方式。

    7510

    Java中BigDecimal简单及复杂计算(开根、小数次、三角函数、π值等)

    方法获取两个 BigDecimal 对象的余数 BigDecimal result = BigDecimal.TEN.remainder(BigDecimal.valueOf(4)); //result=2; 运算...:使用 pow 方法计算 BigDecimal 对象的 BigDecimal result = BigDecimal.valueOf(3).pow(3); //result=27; 比较运算:使用 compare...方法获得比较结果 复杂运算 以上是常用的运算,但是如果设计复杂度开根或者小数次的话,自带的方法就不满足了,因此,需要引入其他的BigDecimal运算类(big-math),引入以下依赖: <!...BigDecimalMath.sqrt(num1, new MathContext(6)); System.out.println("result="+result); // result=1.41421 <em>幂</em>运算...:使用 pow 方法计算 BigDecimal 对象的<em>幂</em>(计算x的y<em>次</em><em>幂</em>,支持小数) BigDecimal num1 = new BigDecimal("2"); BigDecimal num2 = new

    3.3K40

    一文看懂HashMap扩容为什么是2的n

    HashMap是Java中的集合类,是存放键值对形式的数据(Key和Value),例如QQ账号和QQ密码,QQ账号就是Key而密码则是Value。...2.为什么扩容2的n? 首先先看一下HashMap中的putVal方法(存值的)和resize方法(扩容的),之所以HashMap扩容是2的n和这两个方法有千丝万缕的联系。...通过putVal方法可以看出来HashMap在存值时会先把key的hash值和扩容后的长度进行一按位与运算,其中hash是在hash方法中把key进行计算后的出来的结果,n是扩容的长度(也就是数组的长度...然后遍历旧的tab,将旧的元素进行e.hash & (newCap - 1)的计算添加进新的tab中,也就是(n - 1) & hash的计算方法,其中n是集合的容量,hash是添加的元素经过hash函数计算出来的...通过上面的对比可以看出来11111111和其他值 比较大大的减少了hash碰撞的发生,这样就是为什 么HashMap为什么扩容采用2的n的原因。

    6.3K90
    领券