
HashMap
文章平均质量分 57
# SSM框架
伏加特遇上西柚
犹如烈焰般的伏特加和温柔酸甜的西柚碰撞在一起,将是一种美好的相遇。
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
HashMap超详细分析
特点: 1.存取无序的 2.键和值位置都可以是null,但是键位置只能是一个null 3.键位置是唯一的,底层的数据结构控制键的 4.jdk1.8前数据结构是:链表 + 数组 jdk1.8之后是 : 链表 + 数组 + 红黑树 5.阈值(边界值) > 8 并且数组长度大于64,才将链表转换为红黑树,变为红黑树的目的是为了高效的查询。 存放数据步骤: 第一步:首次插入元素 1.1 通过key调用String类中的hashCode()方法计算出hash值。 1.2 hash值与数组长度减一做按位原创 2020-11-28 17:24:35 · 233 阅读 · 0 评论 -
计算hash值的方法
计算hash值得方法: 对于key的hashCode做hash操作,无符号右移16位然后做异或运算。 还有平方取中法,伪随机数法和取余数法。这三种效率都比较低。而无符号右移16位异或运算效率是最高的。 集合中的初始化容量(必须是二的n次幂) //默认的初始容量是16 -- 1<<4相当于1*2的4次方---1*16 static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; static final int hash(Object原创 2020-11-28 17:22:57 · 13776 阅读 · 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 · 11906 阅读 · 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 · 991 阅读 · 0 评论 -
为什么Map桶中节点个数超过8才转为红黑树?
源码中的说法: TreeNodes占用空间是普通Nodes的两倍,所以只有当bin包含足够多的节点时才会转成TreeNodes,而是否足够多就是由TREEIFY_THRESHOLD的值决定的。当bin中节点数变少时,又会转成普通的bin。并且我们查看源码的时候发现,链表长度达到8就转成红黑树,当长度降到6就转成普通bin。 这样就解释了为什么不是一开始就将其转换为TreeNodes,而是需要一定节点数才转为TreeNodes,说白了就是权衡,空间和时间的权衡。 这段内容还说到:当hashCode离散性很好的原创 2020-11-28 16:38:17 · 563 阅读 · 0 评论 -
HashMap中如何计算数组索引下标?
对于key的hashCode做hash操作,无符号右移16位然后做异或运算。 还有平方取中法,伪随机数法和取余数法。这三种效率都比较低。而无符号右移16位异或运算效率是最高的。 集合中的初始化容量(必须是二的n次幂) //默认的初始容量是16 -- 1<<4相当于1*2的4次方---1*16 static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; 问题: 为什么必须是2的n次幂?如果输入值不是2的幂比如10会怎么样? 举例分析:原创 2020-11-28 16:28:51 · 2385 阅读 · 0 评论