Interger
public static int hashCode(int value) {
return value;
}
Interger类型数据的hashcode仅仅是返回其原有的值
Float
public static int hashCode(float value) {
return floatToIntBits(value);
}
public static int floatToIntBits(float value) {
if (!isNaN(value)) {
return floatToRawIntBits(value);
}
return 0x7fc00000;
}
返回将float数据ieee754标准的二进制视为十进制的数
例9.0
9.0
写成二进制为1001,也可写成1.001×2^3.
符号位为0
浮点数的阶码为3+127=130=1000 0010
数值位默认删除第一位整数位的1,只保留小数点后的数。为00100000补够后面的零
所以9.0的表示就是
0
1000 0010
0010 0000 0000 0000 0000 000
将9.0的二进制表示视为十进制,即将01000 001000100000000000000000000
视为一个十进制整数的,所以9.0f的hashcode值为1091567616
Double
public static int hashCode(double value) {
long bits = doubleToLongBits(value);
return (int)(bits ^ (bits >>> 32));
}
bits是双精度规格化浮点数的二进制
Double类的数据的hashcode是返回bits右移32位然后与bits相异或的结果
浮点数的表示
最高位是符号位(0为正,1为负)
其后的11位是阶码位以2为底,用移码表示,移码的偏置量是2^(11-1)-1=1023,
后52位是尾数的数值位。
例:浮点数是9.0
写成二进制则为1001,也可写成1.001×2^3.
符号位为0
浮点数的阶码为3+1023=1026=10000000010
数值位默认删除第一位整数位的1,只保留小数点后的数。为00100000补够后面的零
所以9.0的表示就是
0
10000000010
0010000000000000000000000000000000000000000000000000
异或
当两个数不同时为1,相同时为0
0∧0=0,0∧1=1,1∧1=0,1∧0=1
String
public static int hashCode(byte[] value) {
int h = 0;
int length = value.length >> 1;
for (int i = 0; i < length; i++) {
h = 31 * h + getChar(value, i);
}
return h;
byte[] value传过来的是String每一个字符转成ascii码后的数组.
至于为什么选择31作为乘子,可以看 这篇文章