zoukankan      html  css  js  c++  java
  • HashCode()函数详解

    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作为乘子,可以看 这篇文章

  • 相关阅读:
    对生产稳定的一些思考
    tsar指标解释
    tsar采集nginx指标
    Nginx如何处理一个连接
    Java : 如何更优雅的设计异常
    MySql的索引实现
    IntelliJ Idea 常用配置
    ICSharpCode.SharpZipLib.dll 压缩、解压Zip文件 附源码
    Java BigDecimal使用
    社交系统中用户好友关系数据库设计
  • 原文地址:https://www.cnblogs.com/INnoVationv2/p/9032681.html
Copyright © 2011-2022 走看看