探究常用类的hashCode生成规则

在Java的Object 类中提供了hashCode() 方法,这样会将拥有相同hashCode 的对象放在同一个桶中,这样的话就会很好的我们查询的速度。
更多参考:http://blog.csdn.net/zhangyuan19880606/article/details/51240372

这里我们来看一下常用的类中hashCode 的生成规则

首先是IntegerhashCode() 方法的源码

    @Override
    public int hashCode() {
        return Integer.hashCode(value);
    }
    public static int hashCode(int value) {
        return value;
    }

其中value 就是当前Integer 对象中存储的数值,同时也是其对应的散列值

        Integer num1=new Integer(10);
        Integer num2=new Integer(20);

        System.out.println(num1.hashCode());    //10
        System.out.println(num2.hashCode());    //20

接下来看一下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;
    }

如上的代码可以知道,String 类的散列值就是依次遍历其每个字符成员,递归的将当前得到的hashCode乘以31然后加上下一个字符成员的ASCII值(h = 31 * h + val[i];

如下我们来计算一下String str="10" 的散列值

'1' -> 49
'0' -> 48

h=31*0+49=49
h=31*49+48=1567

我们在程序中运行一下来验证我们的计算结果

        String str1=new String ("10");

        System.out.println(str1.hashCode());    // 1567

有关Long 类型的源码如下


    @Override
    public int hashCode() {
        return Long.hashCode(value);
    }
    public static int hashCode(long value) {
        return (int)(value ^ (value >>> 32));
    }

可知是将原数据与其逻辑右移32位后的结果进行亦或操作后得到的结果作为其散列值

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值