探究常用类的hashCode生成规则

时间:2021-02-09 16:48:46

在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位后的结果进行亦或操作后得到的结果作为其散列值