String中hashCode算法

作者: 橙小张 | 来源:发表于2017-07-06 11:06 被阅读50次

    说起hashCode是,就先说下HashCode一些关键点:
    1、hashCode的存在主要是用于查找的快捷性,如Hashtable,HashMap等,hashCode是用来在散列存储结构中确定对象的存储地址的;
    2、如果两个对象相同,就是适用于equals(Java.lang.Object) 方法,那么这两个对象的hashCode一定要相同;
    3、如果对象的equals方法被重写,那么对象的hashCode也尽量重写,并且产生hashCode使用的对象,一定要和equals方法中使用的一致,否则就会违反上面提到的第2点;
    4、两个对象的hashCode相同,并不一定表示两个对象就相同,也就是不一定适用于equals(java.lang.Object) 方法,只能够说明这两个对象在散列存储结构中,如Hashtable,他们“存放在同一个篮子里”

    • 总结一句话就是:hashCode是为了方便查找,hashCode相同,两个对象不一定相等,但是两个对象相等,hashCode一定相同。

    通过一段代码来测试下:


    image.png
    • 17-19行创建了3个字符串对象
    • 20-22行输出了对应的hash值,可以看到a和c的hash值是一样的

    String的hashCode方法的代码

    image.png
    • hashCode方法的核心代码是1471行,其实现的计算公式为s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1],这也是说为什么hashCode相同,对象不一定相等的原因了,不同的字符串是可以通过计算逻辑累加一个相同的hash值的。
    image.png
    • String最终是以char数组存储的
    • hashcode实现中在1468行将该String的value赋值给了char val[]

    自己实现的话可以这样

    image.png

    总结:

    • 深入学习的String内幕的话可以看下这篇博客:http://www.jianshu.com/p/2f209af80f84
    • 学习下算法(巧妙地以一行代码实现复杂的s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1]计算)

    相关文章

      网友评论

        本文标题:String中hashCode算法

        本文链接:https://www.haomeiwen.com/subject/gwfhhxtx.html