在实际的工作中我们经常会用到hashCode,不管是简单哈希还是一致性哈希,底层的哈希算法都是一样的,今天参考源码做一个回顾:

先看hashCode的源码:

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

其中最重要的核心算法逻辑就是注释中的一行:

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

以下是自己做的一个Demo来验证hashCode是如何产生的?

package com.google;/*** @Author: ♞Demons♕* @DATE: 2018/11/9 11:01* @Description: hashCode的实现* 哈希算法的公式 : s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1]* n表示将字符串切分成字符数组后的字符的个数* s[n]表示字符数组下标是n的字符的ASCII码*/
public class TestHash {public static void main(String[] args) {String hashCode = "22";// 2的ASCII码是:50,故22的hashCode的值是:50*31^1 + 50*31^0 = 1600System.out.println(hashCode.hashCode());// 实际使用中常使用hashCode的正数形式,可用这种形式转换System.out.println(Math.abs(hashCode.hashCode()));String code = "code";// code中的每个字符的ASCII码分别是:99-111-100-101,// 故code的hashCode的值是:99*31^3 + 111*31^2 + 100*31^1 + 101 = 3059181System.out.println(code.hashCode());}
}

至于为什么是31这个神奇的数字?可以参考这个博客:

https://blog.csdn.net/steveguoshao/article/details/12576849

HashCode源码解析相关推荐

  1. JDK源码解析——Object的hashCode方法

    目录 前言 说明 一.源码目录结构 (1).JDK目录 (2).hotspot目录 二.基础知识 (1).Object Header(对象头) (2).Lock(锁) 1. 无锁 => 偏向锁 ...

  2. Java源码解析:hashCode与相同对象的关系

    1.普通类对象 1. hashCode相同,不一定是同一个对象 2. 同一个对象的,hashCode值一定相同 2. 数值型的原始数据类型对应的包装类 只要值是一样的,hashCode就会是相同的.尽 ...

  3. spring aop 注入源码解析

    spring aop 注入源码解析 aop启动 AbstractApplicationContext.java @Overridepublic void refresh() throws BeansE ...

  4. JDK源码解析之集合篇2--Collection

    为什么80%的码农都做不了架构师?>>>    源码解析仅个人记录,若有不正确,请留言修改 package java.util;import java.util.function.P ...

  5. 2015.07.20MapReducer源码解析(笔记)

    MapReducer源码解析(笔记) 第一步,读取数据源,将每一行内容解析成一个个键值对,每个键值对供map函数定义一次,数据源由FileInputFormat:指定的,程序就能从地址读取记录,读取的 ...

  6. spring aop 注入源码解析 1

    spring aop 注入源码解析 aop启动 AbstractApplicationContext.java @Overridepublic void refresh() throws BeansE ...

  7. Java HashSet源码解析

    本解析源码来自JDK1.7,HashSet是基于HashMap实现的,方法实现大都直接调用HashMap的方法 另一篇HashMap的源码解析文章 概要 实现了Set接口,实际是靠HashMap实现的 ...

  8. HashMap源码解析(JDK1.8)

    HashMap源码解析(JDK1.8) 目录 定义 构造函数 数据结构 存储实现源码分析 删除操作源码分析 hashMap遍历和异常解析 1. 定义 HashMap实现了Map接口,继承Abstrac ...

  9. 容器源码解析之HashMap(七)

    再进入源码解析之前,先来看看hashMap的工作原理 当我们执行put存值时,hashmap会先调用key的hashcode方法的到哈希码,也就是桶的索引bucketIndex,找到该桶,然后遍历桶用 ...

最新文章

  1. QIIME 2教程. 01简介和安装 Introduction Install(2020.11开始更新)
  2. 全网首发 | 第一个opencv_contrib扩展模块中文教程限时领取
  3. 对称性破缺衰变与分类
  4. Windows上的音频采集技术
  5. 机器学习(三十三)——价值函数的近似表示
  6. C++ 学习之旅(11)——类和结构中的static
  7. ES6 数组、对象的扩展
  8. calender获取日期前几月_java获取当前时间和前一天日期(实现代码)
  9. Redis 与 hash (哈希)相关的常用命令
  10. php.ini 中文详解
  11. poj1094Sorting It All Out(拓扑排序)
  12. TypeScript 3.4 发布
  13. Android导入第三方jar包
  14. Android进程与内存及内存泄露
  15. Python 导入requests报错No module named requests
  16. iPhone 11 128G 抱回家!
  17. reviewboard mysql_ReviewBoard安装配置
  18. 基于 Laravel 9 和 Bulma 开发的个人博客
  19. 微信小程序评论/留言功能,附:前端+后端代码+视频讲解!
  20. 物联网有哪些安全风险?物联网安全问题汇总

热门文章

  1. springboot学习(一)IDEA简单使用以及数据源配置的三种方法
  2. 虚拟化与网络存储技术
  3. DDR4 Spec 第四章 4.26-4.27
  4. 电子数据取证之Android APK分析
  5. 基于S3C2440的linux-3.6.6移植——LED驱动
  6. PTA|pintia.cn计算摄氏温度
  7. 区块宝周报:区块链一周大事排行榜0930
  8. 3D电影为何如此有魅力?重置版的《阿凡达》依旧让人疯狂
  9. 苹果拟4亿美元收购音乐识别软件Shazam
  10. js遍历表单中所有的input的name与值,并创建一个对象,需要jquery插件