探究常用类的hashCode生成规则

Posted 十木禾

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了探究常用类的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位后的结果进行亦或操作后得到的结果作为其散列值

以上是关于探究常用类的hashCode生成规则的主要内容,如果未能解决你的问题,请参考以下文章

从语言设计的角度探究Java中hashCode()和equals()的关系

重写java类的equals()和hashCode方法

Object类的equals和hashCode方法

Boolean.hashCode()

Java 中哈希码的说明

Object类