首先来看一下String中hashCode方法的实现源码。

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中有一个私有实例字段hash表示该串的哈希值,在第一次调用hashCode方法时,字符串的哈希值被计算并且赋值给hash字段。之后再调用hashCode方法便可以直接取hash字段返回。

String类中的hashCode计算方法还是比较简单的,就是一31为权,每一位字符的ASCII只进行计算,用自然溢出来等效取模。

哈希计算公式可以记为s[0]*31^(n-1)+s[1]*31^(n-2)+...+s[n-1]。

关于为什么取31为权,可以参考StackOverflow上的这个问题

主要原因是因为31是一个奇素数,所以31*i=32*i-i=(i<<5)-i,这种位移与剪发结合的计算相比一般的运算块很多。

字符串哈希可以做很多事情,通常是类似于字符串判等,判回文之类的。

但是仅仅依赖于哈希值来判断其实是不严谨的,除非能够保证不会有哈希值冲突。通常这一点很难做到。

就拿jdk中String类的哈希方法来举例,字符串“gdejicbegh”与字符串"hgebcijedg"具有相同的hashCode()返回值-801038016,并且他们具有reverse的关系。这个例子说明了用jdk中默认的hashCode方法判断字符串相等或者字符串回文都存在反例。

关于Java中hashCode方法的实现源码的更多相关文章

  1. java中的==、equals()源码分析

    浅谈Java中的equals和== 在初学Java时,可能会经常碰到下面的代码: 1 String str1 = new String("hello"); 2 String str ...

  2. Java并发工具类CountDownLatch源码中的例子

    Java并发工具类CountDownLatch源码中的例子 实例一 原文描述 /** * <p><b>Sample usage:</b> Here is a pai ...

  3. 在Xcode中使用Git进行源码版本控制

    http://www.cocoachina.com/ios/20140524/8536.html 资讯 论坛 代码 工具 招聘 CVP 外快 博客new 登录| 注册   iOS开发 Swift Ap ...

  4. Java并发系列[5]----ReentrantLock源码分析

    在Java5.0之前,协调对共享对象的访问可以使用的机制只有synchronized和volatile.我们知道synchronized关键字实现了内置锁,而volatile关键字保证了多线程的内存可 ...

  5. 【JVM】深度分析Java的ClassLoader机制(源码级别)

    原文:深度分析Java的ClassLoader机制(源码级别) 为了更好的理解类的加载机制,我们来深入研究一下ClassLoader和他的loadClass()方法. 源码分析 public abst ...

  6. Java中hashcode的理解

    Java中hashcode的理解 原文链接http://blog.csdn.net/chinayuan/article/details/3345559 怎样理解hashCode的作用: 以 java. ...

  7. Netty中NioEventLoopGroup的创建源码分析

    NioEventLoopGroup的无参构造: public NioEventLoopGroup() { this(0); } 调用了单参的构造: public NioEventLoopGroup(i ...

  8. Java并发系列[2]----AbstractQueuedSynchronizer源码分析之独占模式

    在上一篇<Java并发系列[1]----AbstractQueuedSynchronizer源码分析之概要分析>中我们介绍了AbstractQueuedSynchronizer基本的一些概 ...

  9. 怎么eclipse或MyEclipse中添加javaSe的源码

    怎么eclipse或MyEclipse中添加javaSe的源码 有时在eclipse里我们调用java提供给我们的方法,我们有时需要查看java提供给我们的调用方法的源码或java提供给我们的核心类的 ...

随机推荐

  1. 如何选择MySQL数据库的安装方式

     MySQL数据库安装有yum安装,rpm安装,二进制编译安装,cmake,或者make安装,但是选择什么样的安装方式则全看实际应用场景. 下为网友总结安装方式选择:   若是对数据库要求不太高的场景 ...

  2. hdu 4632 回文子序列计数

    水题 #include<iostream> #include<stdio.h> #include<cstring> #include<algorithm> ...

  3. CodeForces - 961D:Pair Of Lines (几何,问两条直线是否可以覆盖所有点)

    You are given n points on Cartesian plane. Every point is a lattice point (i. e. both of its coordin ...

  4. Xmodem通信协议实例

    在工作时串口通信的过程中需要传输文件,这里就就需要使用通信协议,此时选择的是Xmodem协议作简要研究 1.什么是Xmodem协议 Xmodem协议是串口通信中广泛使用到的异步文件传输协议.以128字 ...

  5. 任意输入3个数,判断能否组成三角形(python)

    任意输入3个数,判断能否组成三角形. 三角形:两边之和大于第三边 直角三角形:勾股定理 代码如下: # 输入合法性检查,必须输入正数,不支持科学计数法'''try: <语句>except ...

  6. Rails中文乱码问题【转】

    乱码情况一:netbeas控制台输出乱码 具体表现为:在程序中定义中文字符串,然后输出.但输出为乱码 解决方法:打开netbeans安装目录,找到etc目录下的netbeans.conf文件.在net ...

  7. nfs cron shell 笔记

    1.nfs 2.crond 3.shell 1.准备环境: 防火墙 selinux 配置ip 2.安装软件 二进制 源码安装 3.改改配置文件 二进制:/etc/nginx/nginx.conf 源码 ...

  8. JavaScript语言基础-对象与数组

  9. leetcode643

    double findMaxAverage(vector<int>& nums, int k) { double max = INT_MIN; int len = nums.siz ...

  10. Ok6410挂载NFS

    虚拟机: apt-get install portmap apt-get install  nfs-kernel-server mkdir   /nfs/root/mNFS chmod 777 /nf ...