public int hashCode() : 这个方法返回对象的哈希码值。哈希码是一个整数,代表了该对象在内存中的存储位置,它是根据对象的内容计算得出的。如果两个对象相等(即 equals() 方法返回 true),则它们的哈希码必须相等。 hashcode存在主要是为了查找的快捷性,hashcode是用来在散列存储结构中确定对象的存储地址的。
publicstaticinthashCode(byte[] value){int h =0;for(byte v : value){
h =31* h +(v &0xff);}return h;}
Integer 的hashcode:
publicstaticinthashCode(int value){return value;}
比较省事的重写 hashCode 方法就是用别人的轮子
publicinthashCode(){int result =31*declaringClass.hashCode()+ methodName.hashCode();
result =31*result +Objects.hashCode(classLoaderName);
result =31*result +Objects.hashCode(moduleName);
result =31*result +Objects.hashCode(moduleVersion);
result =31*result +Objects.hashCode(fileName);
result =31*result + lineNumber;return result;}publicinthashCode(){returnArrays.hashCode(this.ptypes);}
为什么 String hashCode 方法选择数字31作为乘数? 值 31 被选择是因为它是一个奇素数。如果它是偶数并且乘法溢出,信息将会丢失,因为乘以 2 相当于移位。使用素数的优势不太明显,但它是传统的。31 的一个很好的性质是,乘法可以用移位和减法来替换以获得更好的性能:31 * i == (i << 5) - i 。现代虚拟机会自动进行这种优化。