🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
### 定义: hash算法的功能是保证快速查找被检索的对象,hash算法的价值在于速度;当需要查询集合中某个元素时,hash算法可以直接根据该元素的hashcode值计算出该元素的存储位置,从而快速定位该元素; hashCode就是根据存储在一个对象实例中的所有数据,提取出一个32位的整数,该整数的目的是用来标示该实例的唯一性;有点类似于MD5码,每个文件都能通过MD5算法生成一个唯一的MD5码。不过,Java中的hashCode并没有真正的实现为每个对象生成一个唯一的hashCode,还是会有一定的重复几率 ``` public native int hashCode(); ``` ### 哈希码产生的依据 哈希码并不是完全唯一的,它是一种算法,让同一个类的对象按照自己不同的特征尽量的有不同的哈希码,但不表示不同的对象哈希码完全不同。也有相同的情况,看程序员如何写哈希码的算法;通常情况下,这个值是对象头部的一部分二进制位组成的数字,这个数字具有一定的标识对象的意义存在,但绝不等价于地址; ![](https://img.kancloud.cn/70/fe/70feee1717b264b5c45eabedc1a99143_842x164.png) ### hashCode的作用 它为了产生一个可以标识对象的数字,不论如何复杂的一个对象都可以用一个数字来标识; > hashCode是为了算法快速定位数据而存在;equals是为了对比真实值而存在; ### 知识点 * 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是数组长度 ```