Java基本都会重写Object中的hashCode方法,归类记录hashCode的重写
基本数据类型
基本数据类型
//byte => Byte(封装类)
public static int hashCode(byte value) {return (int)value;}
//short => Short(封装类)
public static int hashCode(short value) {return (int)value; }
//int => Integer(封装类)
public static int hashCode(int value) {return value;}
//long => Long(封装类)
public static int hashCode(long value) {
return (int)(value ^ (value >>> 32));
}
//char => Character(封装类)
public static int hashCode(char value) {return (int)value;}
//String
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;
}
//bool => Boolean(封装类)
public static int hashCode(boolean value) {
return value ? 1231 : 1237;
}
//float => Float
public static int floatToIntBits(float value) {
int result = floatToRawIntBits(value);
if ( ((result & FloatConsts.EXP_BIT_MASK) ==
FloatConsts.EXP_BIT_MASK) &&
(result & FloatConsts.SIGNIF_BIT_MASK) != 0)
result = 0x7fc00000;
return result;
}
//double => Double
public static int hashCode(double value) {
long bits = doubleToLongBits(value);
return (int)(bits ^ (bits >>> 32));
}
public static long doubleToLongBits(double value) {
long result = doubleToRawLongBits(value);
if ( ((result & DoubleConsts.EXP_BIT_MASK) ==
DoubleConsts.EXP_BIT_MASK) &&
(result & DoubleConsts.SIGNIF_BIT_MASK) != 0L)
result = 0x7ff8000000000000L;
return result;
}
总结:
返回结果为整型int数据,故byte、short和int本身可直接输出,long型数据用折半异或(我自己起的名字)得出hashCode,char直接强转得到int值,String用*31的方式,浮点数的我还没看。
HashMap的构建中有涉及到hashCode重复的情况,分析基本数据类型可能的重复情况,long的前32位和后32位的折半异或可能产生相同值,String不同的字符组合可能产生重复。浮点数没看。
网友评论