赞
踩
目录
HashMap都讲烂了现在,开口就是HashMap存储的是键值对<key,value>的形式,JDK1.8之前实现原理是数组+链表,1.8以后是数组+链表/红黑树。
首先HashMap在构建的时候1.8以前在new的时候就创造了空间,而1.8以后只有当执行put()方法的时候才创造空间,默认数组长度为16,也就是2的4次方。为什么是16呢,这在HashMap的源码中已经规定,必须是2的幂。
说道HashMap我们一直在用的就是put方法,当执行一个put方法时,会发生哪些过程呢?让我们顺着源码看!
如果为null或0,执行resize()扩容
也就是是否已经存入过这个hash值(hash值相同,key值不一定相同)
举个例子
可以明显看出hashcode相同但是实际的值不同,所以要检测hash冲突
根据传入的hash判断一下table数组中是否有同样的hash,如果为null也就是没有,直接构造节点,存入,如果没有进入另个处理
如果冲突就要调用equals方法判断是否相等,如果相等就直接覆盖,再判断一下
如果不相等,判断是否为树的类型,如果是按树的类型插入或覆盖
不是树的类型说明是链表,遍历链表如果相同就覆盖,不同的话就就插入,
插入的时候还得检查是否超过8的长度,如果超过进行链表转红黑树
插入完成后记录hashmap存了多少数据,并判断是否超过了限度
threshold(临界值 )= capacity(容量)+loadFactor(加载因子),这个值就是已占用数组长度的最大值
扩容后是之前的两倍
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。