ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

HashMap源码笔记

2020-12-21 21:03:06  阅读:169  来源: 互联网

标签:CAPACITY HashMap 16 int 笔记 源码 static final


//默认 初始容量 16(可以简单的理解为左移一次乘2,右移一次除2)

static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // aka 16

//最大容量 (设置成2^30 的原因是因为左1<<31为负)

static final int MAXIMUM_CAPACITY = 1 << 30;

//负载因子

static final float DEFAULT_LOAD_FACTOR = 0.75f;

//一个桶中Node个数大于8转换为红黑树

static final int TREEIFY_THRESHOLD = 8;

//一个桶中Node个数低于6,如果有树将转换为链表

static final int UNTREEIFY_THRESHOLD = 6;

//如果HashMap中容量低于64,只会触发扩容,不会将链表转树

static final int MIN_TREEIFY_CAPACITY = 64;

//桶 

transient Node<K,V>[] table;

 

 

//hash的算法hashCode调用底层public native int hashCode(); (注解中写的是转换一个地址,查阅资料说前线程有关的一个随机数+三个确定值,运用Marsaglia’s xorshift scheme随机数算法得到的一个随机数)

//为什么会高低位异或(^)

//在像HashMap中添加数据的时候,算在table中位置吃使用(newTab[e.hash & (newCap - 1)])如果出现尾数相同的一些二进制数值,碰撞会变多,使HashMap中值

//分配不均匀,降低效率。所以使用高低位异或的方法

//2的整数次幂二进制表示为 00100000,必定只有一个1,多个0,而-1的情况下 二进制表示为000111111

//此时二进制&的结果只取决于后几位有1的

static final int hash(Object key) {
 int h;
 return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
}

//获取一个距离输入整数最近的一个2的多次幂

//一个整数,最前面的一位肯定是1,不断的右移,使后面跟着的位都变成1(1|0=1)

//为什么要cap-1,个人理解位避免比如输入8输出结果为16,造成结果偏移太大

static final int tableSizeFor(int cap) {
 int n = cap - 1;
 n |= n >>> 1;
 n |= n >>> 2;
 n |= n >>> 4;
 n |= n >>> 8;
 n |= n >>> 16;
 return (n < 0) ? 1 : (n >= MAXIMUM_CAPACITY) ? MAXIMUM_CAPACITY : n + 1;
}

 

标签:CAPACITY,HashMap,16,int,笔记,源码,static,final
来源: https://www.cnblogs.com/w-c-p/p/14169938.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有