博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java8的hashmap源码简单分析
阅读量:5731 次
发布时间:2019-06-18

本文共 1085 字,大约阅读时间需要 3 分钟。

hot3.png

原来的hashmap采用的是数组加链表的方式,关于java里面实现链表我前面的文章有提到过实现思路,使用静态链表。在java8里是采用了数组+链表+红黑树。

static final int TREEIFY_THRESHOLD = 8;

只要阀值超过了8,链表会转换为一棵平衡二叉查找树 数据结构的每一个小格子存储的数据为一个桶,桶后面存储的每一个数据为bin,这是java8里面的注释说这玩意儿叫bin。

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

capacity 为桶的容量,默认初始值为16,最大为,2^30==1073741824

static final int MAXIMUM_CAPACITY = 1 << 30;

当量变少的时候,树会转变为链表,也有一个阀值,当低于6的时候会变化为树来存储。

static final int UNTREEIFY_THRESHOLD = 6;

以前学习数据结构和算法的时候用c实现过简单的hashmap,那时候感觉挺有意思,记得有一次面试某公司的时候被问及hashset的实现原理,我那时候并没看源码,随口答的我不知道,但是如果是我的话会用hashmap去实现不用重复造轮子,面试官一脸不悦说感觉错了,场面一顿尴尬,当然不用说肯定挂了。。。 后来回家我去看了下hashset的源码,一脸懵逼的看到这个:

private transient HashMap
map; // Dummy value to associate with an Object in the backing Map private static final Object PRESENT = new Object(); /** * Constructs a new, empty set; the backing
HashMap instance has * default initial capacity (16) and load factor (0.75). */ public HashSet() { map = new HashMap<>(); }

hashset的实现是彻头彻尾的用的hashmap来实现的,不是我懒,oracle比我还懒。

转载于:https://my.oschina.net/110NotFound/blog/3005720

你可能感兴趣的文章
Windows 10 IoT Serials 1 - 针对Minnow Board MAX的Windows 10 IoT开发环境搭建
查看>>
Cocos2d-x3.0 lua捆绑C++分类
查看>>
C#操作Cookie
查看>>
【Java】获取一个目录下的名称符合一定要求的全部文件+目录
查看>>
锤子OneStep及BigBang使用体验
查看>>
CSS z-index 属性
查看>>
AgileEAS.NET平台工具之数据原型设计器的使用场景示例
查看>>
libyuv编译【转】
查看>>
日程管理 FullCalendar
查看>>
【下载】(.NET)JTBC网站内容管理系统(v2.0.0.9)
查看>>
[Android Pro] UI设计师不可不知的安卓屏幕知识
查看>>
eclipse内置resin的方法
查看>>
LUA 运算笔记
查看>>
WSDL 1.1 规范
查看>>
中断中处理延时及一些函数的调用规则(中断调i2c驱动有感)--中断中的延迟delay与printk函数的冲突【转】...
查看>>
Android 所有版本区别总结(转)
查看>>
2012开源项目计划-WPF企业级应用整合平台
查看>>
Java-DateUtils工具类
查看>>
极速理解设计模式系列:20.模板方法模式(Template Method Pattern)
查看>>
对缓存的思考【续】——编写高速缓存友好代码
查看>>