源码探究Java_HashMap
1. HashMap 定义,抽取HashMap类中主要变量,如下
public class HashMap<K,V> extends AbstractMap<K,V> implements Map<K,V>, Cloneable, Serializable {
/** map中键值对的数量 */
transient int size;
/** 阀值 (阀值=加载因子*容量),达到后则扩容 */
int threshold;
/** 加载因子,默认0.75*/
final float loadFactor;
/** 计算hash值的种子*/
transient int hashSeed = 0;
/** 数组 */
transient Entry<K,V>[] table = (Entry<K,V>[]) EMPTY_TABLE;
/** 链表节点定义 */
static class Entry<K,V> implements Map.Entry<K,V> {
/** 键名 */
final K key;
/** 键值 */
V value;
/** 后继节点 */
Entry<K,V> next;
/** 当前key的hash值 */
int hash;
}
}
2. hash值如何计算
final int hash(Object k) {
int h = hashSeed;
/** 字符串hash计算 */
if (0 != h && k instanceof String) {
return sun.misc.Hashing.stringHash32((String) k);
} h ^= k.hashCode(); /**此函数确保在每个位位置仅相差常数倍的hashCodes具有有限的冲突数(默认加载因子大约为8)*/
h ^= (h >>> 20) ^ (h >>> 12);
return h ^ (h >>> 7) ^ (h >>> 4);
}
3. 在上一步中查看字符串怎么计算hash值的时候发现HashMap内部的一个恶汉式的单例实现
private static class Holder {
static final JavaLangAccess LANG_ACCESS = SharedSecrets.getJavaLangAccess();
private Holder() {
} static {
if(null == LANG_ACCESS) {
throw new Error("Shared secrets not initialized");
}
}
}
源码探究Java_HashMap的更多相关文章
- spring-cloud-sleuth+zipkin源码探究
1. spring-cloud-sleuth+zipkin源码探究 1.1. 前言 粗略看了下spring cloud sleuth core源码,发现内容真的有点多,它支持了很多类型的链路追踪, ...
- spring-boot-2.0.3之quartz集成,数据源问题,源码探究
前言 开心一刻 着火了,他报警说:119吗,我家发生火灾了. 119问:在哪里? 他说:在我家. 119问:具体点. 他说:在我家的厨房里. 119问:我说你现在的位置. 他说:我趴在桌子底下. 11 ...
- Vue源码探究-全局API
Vue源码探究-全局API 本篇代码位于vue/src/core/global-api/ Vue暴露了一些全局API来强化功能开发,API的使用示例官网上都有说明,无需多言.这里主要来看一下全局API ...
- Vue源码探究-事件系统
Vue源码探究-事件系统 本篇代码位于vue/src/core/instance/events.js 紧跟着生命周期之后的就是继续初始化事件相关的属性和方法.整个事件系统的代码相对其他模块来说非常简短 ...
- Vue源码探究-状态初始化
Vue源码探究-状态初始化 Vue源码探究-源码文件组织 Vue源码探究-虚拟DOM的渲染 本篇代码位于vue/src/core/instance/state.js 继续随着核心类的初始化展开探索其他 ...
- Vue源码探究-源码文件组织
Vue源码探究-源码文件组织 源码探究基于最新开发分支,当前发布版本为v2.5.17-beta.0 Vue 2.0版本的大整改不仅在于使用功能上的优化和调整,整个代码库也发生了天翻地覆的重组.可见随着 ...
- SpringBoot读取配置文件源码探究
1. SpringBoot读取配置文件源码探究 1.1. 概览 springboot的源码是再原来的Spring源码上又包了一层,看过spring源码都知道,当我们从入口debug进去的时候,原来的S ...
- @Async源码探究
1. @Async源码探究 1.1. 上代码 @SpringBootApplication @EnableAsync public class SpringbootLearnApplication { ...
- Sharding-Jdbc源码探究-读写分离
1. Sharding-Jdbc源码探究-读写分离 1.1. 主入口 找到源码入口 这一个类围绕了springboot配置属性的加载,加载了spring.shardingsphere.datasour ...
随机推荐
- springboot集成mybatis-generator
首先上下成功后的效果: 配置非常简单,我们是通过maven插件来进行的,一共只需要3步: 第一步添加mysql依赖和mysql的maven插件: 由于是非常简单的spring+mysql的原始项目,我 ...
- Oracle数据类型,函数与存储过程
字符串类型 固定长度:char nchar n 表示Unicode编码 可变长度: varchar2 nvarchar2 数字类型:number(P,S)P:整数位数,S小数位数 ...
- lodash pick
(1) _.pick(object, [props]) 创建一个从 object 中选中的属性的对象. var object = { 'a': 1, 'b': '2', 'c': 3 }; _.pic ...
- hdu - 4782 - Beautiful Soup(模拟)
题意:输出一堆乱排版的html标签,去多余空字符,转换为按缩进输出. 题目链接:pid=4782">http://acm.hdu.edu.cn/showproblem.php?pid= ...
- C语言中函数调用过程(如何管理栈空间)
ps:先做草稿,以后有时间再整理并贴图,:) 主要是利用栈底寄存器(ebp).栈顶寄存器(esp)跟eax寄存器(存储返回值)来实现. 假设P调用Q: P() { Q(1,2); } (跟实际情况可能 ...
- MySQL存储过程详解 mysql 存储过程(转)
mysql存储过程详解 1. 存储过程简介 我们常用的操作数据库语言SQL语句在执行的时候需要要先编译,然后执行,而存储过程(Stored Procedure)是一组为了完成特定功能的S ...
- Docker -CentOS 6.5上安装
开始安装daoker之旅: 1. [root@localhost ~]# uname -r -.el6.x86_64 2. [root@localhost ~]# cat /etc/issue Cen ...
- nginx sever_name正则
nginx server_name 规则: 1.确切的server_name匹配 例如: server { listen ; server_name www.luwen.cc luwen.cc; .. ...
- unity, UGUI Text fadeIn
错误写法: Color color = m_text.GetComponent<Text> ().color; Color startColor = new Color (c ...
- Drawable资源的初步使用
刚開始接触到Android的时候,看到类似以下的一个Button: 当时感觉这种button有点像Material Design风格.真的以为是裁剪好的图片,好奇心驱使我上网查找实现的方法,原来不是裁 ...