`
TimerBin
  • 浏览: 361114 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

String源码中hashCode算法

    博客分类:
  • JAVA
阅读更多

针对java中String源码hashcode算法源码分析

 

/** The value is used for character storage. */
private final char value[];  //将字符串截成的字符数组

/** Cache the hash code for the string */
private int hash; // Default to 0 用以缓存计算出的hashcode值

/**
  * Returns a hash code for this string. The hash code for a
  * <code>String</code> object is computed as
  * <blockquote><pre>
  * s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1]
  * </pre></blockquote>
  * using <code>int</code> arithmetic, where <code>s[i]</code> is the
  * <i>i</i>th character of the string, <code>n</code> is the length of
  * the string, and <code>^</code> indicates exponentiation.
  * (The hash value of the empty string is zero.)
  *
  * @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;
    }

 按照上面源码举例说明:

 

String msg = "abcd";  // 此时value[] = {'a','b','c','d'}  因此

for循环会执行4次

第一次:h = 31*0 + a = 97 

第二次:h = 31*97 + b = 3105 

第三次:h = 31*3105 + c = 96354 

第四次:h = 31*96354 + d = 2987074 

由以上代码计算可以算出 msg 的hashcode = 2987074  刚好与 System.err.println(new String("abcd").hashCode()); 进行验证

 

在源码的hashcode的注释中还提供了一个多项式计算方式:

s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1]      

s[0] :表示字符串中指定下标的字符

n:表示字符串中字符长度

a*31^3 + b*31^2 + c*31^1 + d = 2987074  + 94178 + 3069 + 100 = 2987074 ;

 

 

 

 

分享到:
评论

相关推荐

    java中的哈希算法和hashcode深入讲解1

    在String类中,哈希算法的实现主要体现在hashCode()方法中。hashCode()方法的源代码如下所示: ```java public int hashCode() { int h = hash; if (h == 0) { int off = offset; char val[] = value; int len...

    JAVA基本类源代码

    这个压缩包“基本类源代码”很可能包含了Java语言中的一些基础类的源文件,例如`Object`类、`String`类、`Integer`类、`ArrayList`类等。这些类在Java开发中非常常见,深入理解它们的源代码对于提升编程技能和优化...

    StringManipulation:Java中的字符串处理算法

    在Java编程语言中,字符串处理是一项至关重要的任务,因为字符串在各种应用场景...项目的源代码会包含具体的实现,例如如何高效地合并字符串、如何实现不区分大小写的比较等,这些都是对Java字符串处理算法的宝贵实践。

    HashMap模块源码—— 高效随机存取数据结构 ,文本索引必备

    哈希函数用的是java中String.hashCode()算法(经实际验证其碰撞率极低且相近的文本散列值相邻,存取的效率更高.)。可自动无限增加容量(内存允许)。3、连续10万次不同内容存取效率为,存10万次共耗时约280ms ,取10万次...

    java优秀源码-lecture-hashing:出色的哈希算法的源代码+常见哈希函数的Java示例

    在这个"java优秀源码-lecture-hashing"项目中,我们可以深入学习到出色的哈希算法的源代码以及常见哈希函数的Java实现。 1. **哈希表(Hash Table)**: 哈希表是基于哈希函数的数据结构,它提供了一种快速查找、...

    J2SE 核心类库源代码

    源代码是理解这些类库工作原理的关键,通过阅读源码,开发者可以深入学习 Java 的设计理念和实现机制。 在J2SE核心类库中,包括了许多关键模块: 1. **基础类**:如`java.lang`包,其中包含所有Java程序的基本类,...

    java 求两个数组中重复元素源代码

    在Java编程中,找出两个数组中的重复元素是一个常见的问题,特别是在数据处理和算法设计中...以上就是关于“java求两个数组中重复元素源代码”的详细解析,涵盖了数组操作、重复元素查找、代码实现及优化等方面的知识。

    JDK各种类、方法源代码

    在Java开发中,深入理解JDK的源代码是提升编程技能的重要步骤。JDK,全称为Java Development Kit,是Oracle公司提供的Java编程语言的标准开发工具集。它包含了编译器、运行时环境以及一系列用于创建和运行Java应用...

    Java17道面试题及答案

    代码解读:因为 x 和 y 指向的是同一个引用,所以 == 也就是 true,而 new String() 方法则重写开辟了内存空间,所以 == 结果为 false,而 equals 比较的一直是值,所以结果都为 true。 equals 的本质 equals 本质...

    java洗牌代码

    在Java编程语言中,"洗牌"是一种常见的算法,它常用于模拟扑克牌游戏或者其他需要随机排列元素的场景。这个过程通常涉及到数组或集合的随机排序。在这个问题中,我们关注的是如何使用`java.util.Random`类来实现这一...

    Java1.6源码

    它包含了Java开发工具包(JDK)的所有核心类库的源代码,包括Java语言基础库、集合框架、I/O流、网络编程、多线程、反射、垃圾回收等关键组件。通过阅读源码,开发者可以学习到Java设计模式、API实现细节以及内部...

    rt.jar源码

    rt.jar源码的分析对于理解Java语言的底层机制、优化代码性能以及进行Java平台的开发具有重要的意义。 一、rt.jar的构成与作用 rt.jar中的“rt”代表“Runtime”,它是Java运行时系统的关键组成部分。这个jar文件...

    Java HashMap类详解

    HashMap 的存储实现可以通过查看其 put(K key, V value) 方法的源代码来了解。该方法首先判断 key 是否为 null,然后根据 key 的 hashCode 值计算 Hash 值,接着搜索指定 hash 值在对应 table 中的索引,如果 i 索引...

    javajdk源码-JavaJdkSourceCode:javajdk源代码分析

    在这个"JavaJdkSourceCode"项目中,我们可能找到了完整的JDK源代码,这包括了类库、编译器、虚拟机等多个组成部分。 首先,让我们关注Java的基础库,如`java.lang`包,这个包包含了Java中最基础的类,如`Object`、`...

    2020年百度、阿里、腾讯、字节跳动Android高频面试题解析.pdf

    String 类是面试中常见的重点,涉及到字符串的创建、拼接、比较和不可变性等特性。运算章节涵盖了算术、比较、逻辑和位运算符,强调了它们在程序中的应用。关键字是控制程序流程的关键,包括 final、static、...

    易语言-HashMap模块源码—— 高效随机存取数据结构 ,文本索引必备

    哈希函数用的是java中String.hashCode()算法(经实际验证其碰撞率极低且相近的文本散列值相邻,存取的效率更高.) 可自动无限增加容量(内存允许) 3、连续10万次不同内容存取效率为,存10万次共耗时约280ms ,取10万次共...

    毕业设计电商网站源码-Snailclimb:蜗牛爬

    毕业设计电商网站源码 推荐几个比较实用的服务:1. (企业官网、电商网站,多种可供选择模板,代金券免费领取)、2. 、3. Ⅰ Ⅱ Ⅲ Ⅳ Ⅴ Ⅵ Ⅶ Ⅷ Ⅸ Ⅹ :hot_beverage: Java Java/J2EE 基础 Java 集合框架 Java 多...

    疯狂的java讲义项目源码-java-graph-algorithms:BFS、Dijkstra、EdmondKarp、FloydWarsha

    疯狂的java讲义项目源码具有可视化的 Java 图形算法实现并与 JUNG Graph Lib 进行比较 该项目是在第三学期 B.Sc 实践任务中的结果。 应用信息科学“图论概念与算法”课程。 由于本次讲座是在德国大学进行的,因此...

    毕业设计电商网站源码-JAVA-:JAVA-

    毕业设计电商网站源码 推荐几个比较实用的阿里云服务,按需选择:1. 、2. 、3. 、4. (企业官网、电商网站,多种可供选择模板,代金券免费领取) Ⅰ Ⅱ Ⅲ Ⅳ Ⅴ Ⅵ Ⅶ Ⅷ Ⅸ Ⅹ :hot_beverage: Java Java/J2EE 基础...

Global site tag (gtag.js) - Google Analytics