Java基本类型包装类的hashCode方法,Integer、String...

hashCode方法含义

hash值在java中是一个int类型,主要用来在散列存储结构中确定对象的位置,一个好的hashCode方法应该尽量保证应尽量保证对象hash值分布的均匀性,同时减少重复hash值的出现。

Integer中的hashCode方法实现

 public static int hashCode(int value) {
        return value;
    }

Integer的hashCode方法实现比较简单,直接以对应的int值作为hash值。

String中的hashCode方法实现

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;
    }

上面代码中的hash的定义(hash值),value的定义(String对应的char数组):

/** Cache the hash code for the string */
    private int hash; // Default to 0
    private final char value[];
public String(String original) {
        this.value = original.value;
        this.hash = original.hash;
    }

这里的h变量先等于了hash,首先判断hash是否等于0,如果不等于0说明它的hash值不需要再计算一遍了(已经在构造函数中获取了),同时查询ASCII码表知道,null对应的ASCII值为0,显然这也符合hash初始为0的设置(即初始Sting == null)。h不等于0且字符串不为空才执行计算操作,说明空字符串对应的hash值也为0。
计算方式为:val[0]*31^(n-1) + val[1]*31^(n-2)… + val[n-1],使用素数31相乘产生的hash值的重复的概率更小。

Long中的hashCode方法实现

 public static int hashCode(long value) {
        return (int)(value ^ (value >>> 32));
    }

通俗的讲就是将long的前32位与后32位进行异或后得到hash值。

Double中的hashCode方法实现

public static int hashCode(double value) {
        long bits = doubleToLongBits(value);
        return (int)(bits ^ (bits >>> 32));
    }

类似于Long中的实现方法。

Chracter中的hashCode方法实现

 public static int hashCode(char value) {
        return (int)value;
    }

Character中的hashCode方法返回字符对应的ASCII值。

Boolean中的hashCode方法实现

 public static int hashCode(boolean value) {
        return value ? 1231 : 1237;
    }

value为true时对应1231,为false时对应1237。

Boolean中的hashCode方法实现

    public static int floatToIntBits(float value) {
        int result = floatToRawIntBits(value);
        // Check for NaN based on values of bit fields, maximum
        // exponent and nonzero significand.
        if ( ((result & FloatConsts.EXP_BIT_MASK) ==
              FloatConsts.EXP_BIT_MASK) &&
             (result & FloatConsts.SIGNIF_BIT_MASK) != 0)
            result = 0x7fc00000;
        return result;
    }

floatToRawIntBits(value)是一个native方法,具体实现没看,直观的看即是Float对象的hash值等于 函数 floatToRawIntBits返回的值。

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值