HashCode源码解析
在实际的工作中我们经常会用到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源码解析相关推荐
- JDK源码解析——Object的hashCode方法
目录 前言 说明 一.源码目录结构 (1).JDK目录 (2).hotspot目录 二.基础知识 (1).Object Header(对象头) (2).Lock(锁) 1. 无锁 => 偏向锁 ...
- Java源码解析:hashCode与相同对象的关系
1.普通类对象 1. hashCode相同,不一定是同一个对象 2. 同一个对象的,hashCode值一定相同 2. 数值型的原始数据类型对应的包装类 只要值是一样的,hashCode就会是相同的.尽 ...
- spring aop 注入源码解析
spring aop 注入源码解析 aop启动 AbstractApplicationContext.java @Overridepublic void refresh() throws BeansE ...
- JDK源码解析之集合篇2--Collection
为什么80%的码农都做不了架构师?>>> 源码解析仅个人记录,若有不正确,请留言修改 package java.util;import java.util.function.P ...
- 2015.07.20MapReducer源码解析(笔记)
MapReducer源码解析(笔记) 第一步,读取数据源,将每一行内容解析成一个个键值对,每个键值对供map函数定义一次,数据源由FileInputFormat:指定的,程序就能从地址读取记录,读取的 ...
- spring aop 注入源码解析 1
spring aop 注入源码解析 aop启动 AbstractApplicationContext.java @Overridepublic void refresh() throws BeansE ...
- Java HashSet源码解析
本解析源码来自JDK1.7,HashSet是基于HashMap实现的,方法实现大都直接调用HashMap的方法 另一篇HashMap的源码解析文章 概要 实现了Set接口,实际是靠HashMap实现的 ...
- HashMap源码解析(JDK1.8)
HashMap源码解析(JDK1.8) 目录 定义 构造函数 数据结构 存储实现源码分析 删除操作源码分析 hashMap遍历和异常解析 1. 定义 HashMap实现了Map接口,继承Abstrac ...
- 容器源码解析之HashMap(七)
再进入源码解析之前,先来看看hashMap的工作原理 当我们执行put存值时,hashmap会先调用key的hashcode方法的到哈希码,也就是桶的索引bucketIndex,找到该桶,然后遍历桶用 ...
最新文章
- QIIME 2教程. 01简介和安装 Introduction Install(2020.11开始更新)
- 全网首发 | 第一个opencv_contrib扩展模块中文教程限时领取
- 对称性破缺衰变与分类
- Windows上的音频采集技术
- 机器学习(三十三)——价值函数的近似表示
- C++ 学习之旅(11)——类和结构中的static
- ES6 数组、对象的扩展
- calender获取日期前几月_java获取当前时间和前一天日期(实现代码)
- Redis 与 hash (哈希)相关的常用命令
- php.ini 中文详解
- poj1094Sorting It All Out(拓扑排序)
- TypeScript 3.4 发布
- Android导入第三方jar包
- Android进程与内存及内存泄露
- Python 导入requests报错No module named requests
- iPhone 11 128G 抱回家!
- reviewboard mysql_ReviewBoard安装配置
- 基于 Laravel 9 和 Bulma 开发的个人博客
- 微信小程序评论/留言功能,附:前端+后端代码+视频讲解!
- 物联网有哪些安全风险?物联网安全问题汇总