源码阅读笔记

hashCode记录

2019-01-25  本文已影响0人  要拿出真本事了

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不同的字符组合可能产生重复。浮点数没看。

上一篇下一篇

猜你喜欢

热点阅读