HashMap
文章平均质量分 57
# SSM框架
伏加特遇上西柚
犹如烈焰般的伏特加和温柔酸甜的西柚碰撞在一起,将是一种美好的相遇。
展开
-
HashMap超详细分析
特点:1.存取无序的2.键和值位置都可以是null,但是键位置只能是一个null3.键位置是唯一的,底层的数据结构控制键的4.jdk1.8前数据结构是:链表 + 数组 jdk1.8之后是 : 链表 + 数组 + 红黑树5.阈值(边界值) > 8 并且数组长度大于64,才将链表转换为红黑树,变为红黑树的目的是为了高效的查询。存放数据步骤:第一步:首次插入元素1.1 通过key调用String类中的hashCode()方法计算出hash值。1.2 hash值与数组长度减一做按位原创 2020-11-28 17:24:35 · 203 阅读 · 0 评论 -
计算hash值的方法
计算hash值得方法:对于key的hashCode做hash操作,无符号右移16位然后做异或运算。还有平方取中法,伪随机数法和取余数法。这三种效率都比较低。而无符号右移16位异或运算效率是最高的。集合中的初始化容量(必须是二的n次幂)//默认的初始容量是16 -- 1<<4相当于1*2的4次方---1*16static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; static final int hash(Object原创 2020-11-28 17:22:57 · 13496 阅读 · 0 评论 -
HashMap扩容机制
想要了解HashMap的扩容机制你要有这两个问题1.什么时候才需要扩容2.HashMap的扩容是什么1.什么时候才需要扩容当HashMap中的元素个数超过数组大小(数组长度)*loadFactor(负载因子)时,就会进行数组扩容,loadFactor的默认值(DEFAULT_LOAD_FACTOR)是0.75,这是一个折中的取值。也就是说,默认情况下,数组大小为16,那么当HashMap中的元素个数超过16×0.75=12(这个值就是阈值或者边界值threshold值)的时候,就把数组的大小扩展原创 2020-11-28 17:06:54 · 11834 阅读 · 0 评论 -
HashMap中为什么加载因子设置为0.75,初始化临界值是12?
哈希表的加载因子(重点)// 加载因子final float loadFactor;############################################loadFactor加载因子,是用来衡量 HashMap 满的程度,表示HashMap的疏密程度,影响hash操作到同一个数组位置的概率,计算HashMap的实时加载因子的方法为:size/capacity,而不是占用桶的数量去除以capacity。capacity 是桶的数量,也就是 table 的长度length。原创 2020-11-28 16:43:29 · 952 阅读 · 0 评论 -
为什么Map桶中节点个数超过8才转为红黑树?
源码中的说法:TreeNodes占用空间是普通Nodes的两倍,所以只有当bin包含足够多的节点时才会转成TreeNodes,而是否足够多就是由TREEIFY_THRESHOLD的值决定的。当bin中节点数变少时,又会转成普通的bin。并且我们查看源码的时候发现,链表长度达到8就转成红黑树,当长度降到6就转成普通bin。这样就解释了为什么不是一开始就将其转换为TreeNodes,而是需要一定节点数才转为TreeNodes,说白了就是权衡,空间和时间的权衡。这段内容还说到:当hashCode离散性很好的原创 2020-11-28 16:38:17 · 540 阅读 · 0 评论 -
HashMap中如何计算数组索引下标?
对于key的hashCode做hash操作,无符号右移16位然后做异或运算。还有平方取中法,伪随机数法和取余数法。这三种效率都比较低。而无符号右移16位异或运算效率是最高的。集合中的初始化容量(必须是二的n次幂)//默认的初始容量是16 -- 1<<4相当于1*2的4次方---1*16static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; 问题: 为什么必须是2的n次幂?如果输入值不是2的幂比如10会怎么样?举例分析:原创 2020-11-28 16:28:51 · 2261 阅读 · 0 评论