当前位置: 移动技术网 > IT编程>开发语言>Java > HashMap (二)HashMap底层源码图文讲解

HashMap (二)HashMap底层源码图文讲解

2020年07月16日  | 移动技术网IT编程  | 我要评论

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

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网