HashSet,给我们最直观的感受就是两点,不可重复和无序,底层采用了hash存储结构。
其底层是采用了HashMap,今天我们通过深入源码的方式来了解其背后的原理。
我们关注的点有几个
1,所谓的hash表是一个怎么样的结构?
hash表底层结构是一个数组,且数组的元素是一个链表结构。给大家画个图
2,是如何保证唯一的?存放进去的细节如何?
首先,在hashSet的底层源代码中,我们发现,它采用的HashMap来存储的,所以我们的分析重点就是转移到HashMap的分析上
HashMap的put方法如何实现的?接下来,我们继续跟踪源码
关键的hash(key),即根据key得到关键的hash值,我们看看方法是怎么写的?
通过观察源代码,我们得到一个信息,当这个key不为null时,则结果值为多少,关键在于hashCode()方法。
继续回到putValue方法的源码跟踪
整体来说,就是先通过一定的算法,其中算法的关键部分是hashCode方法,得到一个hash值,再通过hash值判断数组中是否存在该元素,如果不存在,则创建节点元素存放数组;如果存在,则添加。最后,判断当前容量是否超过阈值,超过则进行扩容。
3,hashCode()方法可以返回一个固定的整数吗?
答案是不可以,如果这个值返回一个固定值,可以想象得到,hashSet的原先的性能优势将荡然无存,所有的数据会集中到一个位置上,形成一个长链表。
HashSet基于HashMap实现,以无序和不重复为特点。底层结构是一个包含链表的数组,通过hash算法确定元素存储位置。put方法关键在于hash(key)计算,使用hashCode()方法获取key的哈希值,根据哈希值决定元素在数组中的位置。若哈希冲突,通过链表解决。若返回固定hashCode(),会导致性能下降,形成长链表。
3457

被折叠的 条评论
为什么被折叠?



