hashCode记录

作者: 要拿出真本事了 | 来源:发表于2019-01-25 00:00 被阅读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不同的字符组合可能产生重复。浮点数没看。

    相关文章

      网友评论

        本文标题:hashCode记录

        本文链接:https://www.haomeiwen.com/subject/lcspjqtx.html