探究常用类的hashCode生成规则
Posted 十木禾
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了探究常用类的hashCode生成规则相关的知识,希望对你有一定的参考价值。
在Java的Object
类中提供了hashCode()
方法,这样会将拥有相同hashCode
的对象放在同一个桶中,这样的话就会很好的我们查询的速度。
更多参考:http://blog.csdn.net/zhangyuan19880606/article/details/51240372
这里我们来看一下常用的类中hashCode
的生成规则
首先是Integer
的hashCode()
方法的源码
@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生成规则的主要内容,如果未能解决你的问题,请参考以下文章