定义:
hashCode就是根据存储在一个对象实例中的所有数据,提取出一个32位的整数,该整数的目的是用来标示该实例的唯一性;有点类似于MD5码,每个文件都能通过MD5算法生成一个唯一的MD5码。不过,Java中的hashCode并没有真正的实现为每个对象生成一个唯一的hashCode,还是会有一定的重复几率
public native int hashCode();
哈希码产生的依据
哈希码并不是完全唯一的,它是一种算法,让同一个类的对象按照自己不同的特征尽量的有不同的哈希码,但不表示不同的对象哈希码完全不同。也有相同的情况,看程序员如何写哈希码的算法;通常情况下,这个值是对象头部的一部分二进制位组成的数字,这个数字具有一定的标识对象的意义存在,但绝不等价于地址;
hashCode的作用
它为了产生一个可以标识对象的数字,不论如何复杂的一个对象都可以用一个数字来标识;
知识点
- String类是用它的value值作为参数来计算hashCode
public int hashCode() {
int h = hash;
if (h == 0 && value.length > 0) {
char val[] = value;
for (int i = 0; i < value.length; i++) {
h = 31 * h + val[i];
}
hash = h;
}
return h;
}
- 不同的对象可能生成相同的hashcode
String a = "Aa";
String b = "BB";
System.out.println(a.hashCode());
System.out.println(b.hashCode());
-
object.hashCode()方法的返回值默认与System.identityHashCode返回值一致
-
JDK8 HashMap哈希算法
static final int hash(Object key) { //jdk1.8 & jdk1.7
int h;
// h = key.hashCode() 为第一步 取hashCode值
// h ^ (h >>> 16) 为第二步 高位参与运算
return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
}
HashMap如何计算数组索引
(length - 1) & hash //length是数组长度
网友评论