1.HashCode的介绍
在此之前先了解hash和hash表是什么?
hash是一个函数,该函数中的实现就是一种算法,就是通过一系列的算法来得到一个hash值。这个时候,我们就需要知道另一个东西,hash表,通过hash算法得到的hash值就在这张hash表中,也就是说,hash表就是所有的hash值组成的,有很多种hash函数,也就代表着有很多种算法得到hash值。
然后再了解hashcode是什么
通过对象的内部地址(也就是物理地址)转换成一个整数,然后该整数通过hash函数的算法就得到了hashcode。hashcode代表对象的地址说的是对象在hash表中的位置,物理地址说的对象存放在内存中的地址。hashhcode()是native 方法,用于返回对象的哈希码,主要使用在哈希表中,比如 JDK 中的HashMap。
2.hashcode有什么作用呢?
1、HashCode的存在主要是为了查找的快捷性,HashCode是用来在散列存储结构中确定对象的存储地址的(后半句说的用hashcode来代表对象就是在hash表中的位置)
三、equals方法和hashcode的关系?
通过前面这个例子,大概可以知道,先通过hashcode来比较,如果hashcode相等,那么就用equals方法来比较两个对象是否相等。
用个例子说明:上面说的hash表中的8个位置,就好比8个桶,每个桶里能装很多的对象,对象A通过hash函数算法得到将它放到1号桶中,当然肯定有别的对象也会放到1号桶中,如果对象B也通过算法分到了1号桶,那么它如何识别桶中其他对象是否和它一样呢,这时候就需要equals方法来进行筛选了。
1、如果两个对象equals相等,那么这两个对象的HashCode一定也相同
2、如果两个对象的HashCode相同,不代表两个对象就相同,只能说明这两个对象在散列存储结构中,存放于同一个位置
四,不同的引用对象的hashcode的实现不同
这里列举出一部分
1. Integer
结果:
Integer的hashcode源码:
实际上,Integer就是返回本身的值。
2.String
结果:
String的hashcode源码:
源码注释:
/** * Returns a hash code for this string. The hash code for a * {@code String} object is computed as * <blockquote><pre> * s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1] * </pre></blockquote> * using {@code int} arithmetic, where {@code s[i]} is the * <i>i</i>th character of the string, {@code n} is the length of * the string, and {@code ^} indicates exponentiation. * (The hash value of the empty string is zero.) * * @return a hash code value for this object. */
返回此字符串的哈希码。 {@code String} 对象的哈希码计算为 <blockquote><pre> s[0]31^(n-1) + s[1]31^(n-2) + ... + s[ n-1] <pre><blockquote> 使用 {@code int} 算术,其中 {@code s[i]} 是字符串的第 <i>i<i> 个字符,{@code n} 是长度字符串,{@code ^} 表示求幂。 (空字符串的散列值为零。)@return 此对象的散列码值。