HashMap (二)HashMap底层源码图文讲解
HashMap (二)HashMap源码讲解
1.继承体系是什么样的?
2.Node数据结构分析?
HashMap内部有一个Node(Entry)的内部类,其中有四个属性,我们要存储一个值,则需要一个key和一个value,存到map中就会先将key和value保存在这个Node类创建的对象中。
static class Node<K,V> implements Map.Entry<K,V> {
final int hash; //通过key算过来的你hashcode值。
final K key; //就是我们说的map的key
V value; //value值,这两个都不陌生
Node<K,V> next; //指向下一个Node(entry)对象
}
3.底层存储结构介绍?
通过key、value封装成一个node对象,然后通过key的值来计算该node的hash值,通过node的hash值和数组的长度length来计算出entry放在数组中的哪个位置上面,每次存放都是将node放在第一个位置,发生hash冲突的时候,就接下去形成链表。在这个过程中,就是通过hash值来确定将该对象存放在数组中
的哪个位置上。
4.put数据原理分析?
5.什么是Hash碰撞?
hash碰撞是由于Hash算法并不完美,有可能两个不同的原始值在经过哈希运算后得到同样的结果,
这样就是哈希碰撞。
6.什么是链化?
就是多个hash值散列在散列表的同一个内存块,形成多个node 连接,变为链。
7.jdk8为什么引入红黑树?
解决链化太长的问题,会提升查找的效率。(后面我会介绍什么是红黑树)
8.HashMap扩容原理?
,会提升查找的效率。可以查看我的另一篇关于红黑树的博客点击查看
8.HashMap扩容原理?
默认情况下,数组大小为16,那么当hashmap中元素个数超过160.75=12的时候,就把数组的大小扩展为216=32,即扩大一倍,然后重新计算每个元素在数组中的位置,而这是一个非常消耗性能的操作,所以如果我们已经预知hashmap中元素的个数,那么预设元素的个数能够有效的提高hashmap的性能。比如说,我们有1000个元素new HashMap(1000), 但是理论上来讲new HashMap(1024)更合适,不过上面annegu已经说过,即使是1000,hashmap也自动会将其设置为1024。 但是new HashMap(1024)还不是更合适的,因为0.75*1000 < 1000, 也就是说为了让0.75 * size > 1000, 我们必须这样new HashMap(2048)才最合适。
ps:学习于b站暴躁刘老师的总结笔记
本文地址:https://blog.csdn.net/weixin_44359566/article/details/107366422