简单探讨java中String类的hashCode()

来源:互联网 发布:阳西县网络问政首页 编辑:程序博客网 时间:2024/05/01 16:56

对于了解哈希的小伙伴们来说,hashCode()这种函数的用处肯定再明白不过了,简单来说,它的作用就是将一个对象生成相应的hash码,在java中是一个int型整数,可以从我们熟悉的Object类中看出:

public native int hashCode();

当然Object类中并没有具体实现hashCode()方法,所以说任何类在使用hashCode()方法前必须先去重写它,今天我们主要来看String类中对hashCode()的具体实现:

首先我们先来看一个小例子:

package com.test;public class String_hashCode_Test {    public static void main(String[] args) {        // TODO Auto-generated method stub        String a="abc";        String b="abc";        System.out.println(a.equals(b));        System.out.println(a==b);        String c=new String("abc");        System.out.println(a.equals(c));        System.out.println(a==c);    }}

首先我这里不是讲equals与==的区别,不过对它两者不是很熟悉的同学或者有兴趣的同学可以看看我写关于它们两个的文章,这里主要用来说明三个对象之间的关系,让我们先来看一看对眼的结果:
true
true
true
false
从结果可以看出a与b是对同一个对象的引用,而c是对另一个对象的引用,共同点是它们的值都为“abc”;

有了以上的基础,我们再来看一个小例子:

package com.test;public class String_hashCode_Test {    public static void main(String[] args) {        // TODO Auto-generated method stub        String a="abc";        String b="abc";        String c=new String("abc");        System.out.println("a.hashCode="+a.hashCode());        System.out.println("b.hashCode="+b.hashCode());        System.out.println("c.hashCode="+c.hashCode());    }}

我们先来看一下输出结果:
a.hashCode=96354
b.hashCode=96354
c.hashCode=96354
小伙伴们有没有对这个结果感到意外,当然大家对a和b的结果肯定是不意外了,毕竟它们是对同一个对象的引用,但是为什么c的hashCode的值也和a与b的相同呢?

带着疑问我们打开了String类的源文件String.class,目标明确,我们马上找到hashCode()这个函数,让我们一起看源码:

    * @return  a hash code value for this object.    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;    }

我们知道Object类是所有类的父类,所以这里String类重写了hashCode()方法,相信大家都看的懂上面的代码吧,从这个函数里我们可以知道String的hashCode()方法是根据对应的值来计算hashCode的值,到这个我们就豁然开朗了。
所以简单的来说对于String对象:
两个对象相等则它们的hashCode值必然相等;
两个hashCode值相等的对象不一定相等;

其实博主知识简单的介绍了一下String类hashCode()的实现,其实很多时候我们只要看看源码加例子就能理解里面的实现原理,当然实际中很多时候也需要我们自己去实现hashCode()这个函数,学习已有实现的经验对我们的帮助会很大,谢谢大家!

0 0