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

hashCode 为什么乘以 31?深入理解 hashCode 和 hash 算法

HashMap 的 hash 算法的实现原理(为什么右移 16 位,为什么要使用 ^ 位异或) 6. HashMap 为什么使用 & 与运算代替模运算? 7....前言 HashMap 高度依赖的 hashcode 和 hash 算法,虽然在很多书里面,都说这是数学家应该去研究的事情,但我想,程序员也应该了解他是怎么实现的。为什么这么做?...HashMap 的 hash 算法的实现原理(为什么右移 16 位,为什么要使用 ^ 位异或) 好了,知道了 hashCode 的生成原理了,我们要看看今天的主角,hash 算法。...很明显不是一个好的散列算法。 但是如果我们将 hashCode 值右移 16 位,也就是取 int 类型的一半,刚好将该二进制数对半切开。...总结 好了,分析完了 hashCode 和 hash 算法,让我们对 HashMap 又有了全新的认识。当然,HashMap 中还有很多有趣的东西值得挖掘。

2.5K21

深入理解 hashcode 和 hash 算法

摘要 二进制计算的一些基础知识 为什么使用 hashcode String 类型的 hashcode 方法 为什么大部分 hashcode 方法使用 31 HashMap 的 hash 算法的实现原理(...我们知道 HashMap 依赖的 hashcode 和 hash 算法到底是怎么实现的嘛?如果大佬说:早他么知道了。那就装不知道,听楼主吹吹牛逼好不啦。。。。...HashMap 的 hash 算法的实现原理(为什么右移 16 位,为什么要使用 ^ 位异或) 好了,知道了 hashCode 的生成原理了,我们要看看今天的主角,hash 算法。...很明显不是一个好的散列算法。 但是如果我们将 hashCode 值右移 16 位,也就是取 int 类型的一半,刚好将该二进制数对半切开。...总结 好了,分析完了 hashCode 和 hash 算法,让我们对 HashMap 又有了全新的认识。当然,HashMap 中还有很多有趣的东西值得挖掘,楼主会继续写下去。

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

    Hashcode的作用_hashcode实现

    大家好,又见面了,我是你们的朋友全栈君 根据API文档,java中的hashcode事实上是跟equals是有着密切联系的,hashcode是为了提高哈希表的性能 下面的话来自JDK: hashCode...当然我们可以在自己写的类中覆盖hashcode()方法,比如String、Integer、Double。。。。等等这些类都是覆盖了hashcode()方法的。...hash = h; } return h; } 解释一下这个程序(String的API中写到): s[0]*31^(n-1) + s[1]*31^(n-2) + … + s[n-1] 使用 int 算法...在集合中,比如HashSet中,要求放入的对象不能重复,那么首先会调用hashcode,如果hashcode相等,则继续调用equals,也相等,则认为重复。...如果重写equals后,如果不重写hashcode,则hashcode就是继承自Object的,返回内存编码,这时候可能出现equals相等,而hashcode不等,你的对象使用集合时,就会等不到正确的结果

    59120

    hashcode方法实现_java重写hashcode方法

    详解Java中hashCode的作用 以下是关于HashCode的官方文档定义: hashcode方法返回该对象的哈希码值。...hashCode 的常规协定是: 在 Java 应用程序执行期间,在同一对象上多次调用 hashCode 方法时,必须一致地返回相同的整数,前提是对象上 equals 比较中所用的信息没有被修改。...当equals方法被重写时,通常有必要重写 hashCode 方法,以维护 hashCode 方法的常规协定,该协定声明相等对象必须具有相等的哈希码。...ID,我要把这个类存放在以上8个位置之一,如果不用hashcode而任意存放,那么当查找时就需要到这八个位置里挨个去找,或者用二分法一类的算法。...但如果用hashcode那就会使效率提高很多。 我们这个类中有个字段叫ID,那么我们就定义我们的hashcode为ID%8,然后把我们的类存放在取得得余数那个位置。

    85010

    细说 Java hashCode

    hashCode 方法的定义 在 jdk api 中 关于 hashCode 有如下说明: Returns a hash code value for the object....所以由上可以得到两条有用的信息,同一个对象 hashcode 的值在一次运行中一定相等,并且不同对象的 hashcode 一定不同,但是他还备注通常使用内部地址转换,但是 JAVA 不是使用这种方式实现的...hashCode 实现原理 hashcode 源码 OpenJDK 的源码可以直接查看,所以我们就选择查看一下其源码一看究竟。...这样一来我们就明白了,每次生成对象以后都会把它的 hashCode存起来,这样无论对象怎么在新生代,老年代之间 游走都不会改变其 hashCode的值,然而事实并没有那么简单。...hashCode 的用途 hashCode 的唯一性决定了他可以用来生成 HashMap的key,同时也能判断对象是否为同一个对象。

    83020

    Java HashCode详解

    一、为什么要有Hash算法 Java中的集合有两类,一类是List,一类是Set。List内的元素是有序的,元素可以重复。Set元素无序,但元素不可重复。...哈希(Hash)是个人名,由于他提出哈希算法的概念就以他的名字命名了。...二、Hash算法原理 HashCode的官方文档定义: hashCode 的常规协定是: 1.在 Java 应用程序执行期间,只要对象的 equals 比较操作所用的信息没有被修改,那么在同一对象上多次调用...8个位置之一,如果不用hashcode而任意存放,那么当查找时就需要到这八个位置里挨个去找,或者用二分法一类的算法。...虽然不能根据hashcode值判断两个对象是否相等,但是可以直接根据hashcode值判断两个对象不等,如果两个对象的hashcode值不等,则必定是两个不同的对象。

    4K50

    equals和hashcode

    才学java的时候,打印某个对象是打印的一串莫名其妙的数字,后来知道这个是hashcode,就以为hashcode是对象的某个地址信息,直到看了一些文章才发现事实并非如此。...hashCode()); // 比较p1 和 p4, 并打印它们的hashCode() System.out.printf("p1.equals(p4) : %s; p1...虽然每个类都有hashcode,但是仅仅某个类的散列表时,该类的hashcode才有用,用来确定该类的某个对象在散列表中的位置,其他情况下hashcode没有作用。...常用的方法:线性探查(按着顺序),二次探查、双重探查 hashcode与equals的关系 当我们往散列表中插入元素时,是通过hashcode找到元素位置,所以有: 两个对象相等,那么hashcode一定相等...如果两个对象hashCode()相等,它们并不一定相等。因为在散列表中,hashCode()相等,即两个键值对的哈希值相等。然而哈希值相等,并不一定能得出键值对相等。

    54810

    hashcode和equals小结

    在开发过程中会有一些需要对比对象是否相等的场景,Object默认的equals和hashcode方法比较的是内存地址,而实际开发中有时想比较的是关键属性是否相等,这就涉及到了重写这两个方法 hashcode...和equials都是用于判断两个对象是否相等,Map和Set中类集合中用到这2个方法时首先判断hashcode的值,如果hash相等再判断equals的结果 结论 1 如果两个对象的equals方法的结果相等...,则两个对象的hashCode方法的返回结果也是相同的 2 任何时候覆写equals方法都必须同时覆写hashCode方法 如果自定义的对象作为Map的键,那么必须覆写hashCode方法和equals...方法 因为 Set 存储的是不重复的对象,依据 hashCode 和 equals 进行判断,所以 Set 存储的对象必须覆写这两种方法(见java开发手册第六章集合处理) 可参考String类中重写的...eques方法和HashCode方法 参考博客:https://blog.csdn.net/wonad12/article/details/78958411 如何重写:https://www.cnblogs.com

    30410

    浅谈原理--hashCode方法

    哈希表也称为散列算法,是依据数据特定算法产生的结果直接指定到一块地址上,这个结果由hashCode方法产生。...这里有A B C D四个对象,分别通过hashCode方法产生了3个值 注意A和B对象调用hashCode产生的值是相同的,即 A.hashCode = B.hashCode()= 0x001 发生了哈希冲突...,都必须返回相同的散列码的hashCode 通过equals调用返回true的2个对象的hashCode一定相同 通过equals返回false的2个对象的hashCode不需要不同,也就是允许hashCode...但现实是存储的元素很难有这样的 ID 关键字,也就很难这种实现 hashCode 的唯一算法,再者就算能实现,但是产生的 hashCode 码是非常大的,这会大的超过 Java 所能表示的范围(因为返回值是...二、重写hashCode 我们应该注意: 不同对象的hashCode码应该尽量不同,避免hash冲突,也就是算法获得元素要尽量均匀。

    1.7K20
    领券