目录
前言
一、HashSet集合特点?
二、源码分析
1.保证元素没有添加到集合
2.查看add()方法源码
3.分析putVal()方法源码
4.图解
总结
前言
提示:今天在重新学习Java基础的集合部分的过程中,看到HashSet集合的源码分析,所以就记录下来,方便以后的学习。
一、HashSet集合特点?
① 底层数据结构是哈希表。
② 对集合的迭代顺序不作任何保证,也就是说不保证存储和取出的元素顺序一致。
③ 没有带索引的方法,所以不能使用普通for循环遍历。
④ 由于是Set集合,所以是不包含重复元素的集合。
二、源码分析
1.保证元素没有添加到集合
1.保证元素没有添加到集合
在HashSet集合中,添加数据的方法add(),在调用该方法的时候就保证了在添加元素的时候不重复添加。
- 示例:
- 结果:
注意:截图中的分析以上面案例元素为例子。
2.查看add()方法源码
在add()这个方法中,可以看到调用的是HashMap里面的put()方法
跟进put()方法,可以看到调用了putVal()方法,
该方法的第一个参数调用了hash()的方法,并且把值传入到该方法,把返回的哈希值作为的参数。
3.分析putVal()方法源码
在putVal()方法中传入的参数
下面主要分析重要的语句:
红框中if的判断:如果哈希表未初始化,就对其进行初始化
红框中if的判断:根据对象的哈希值计算对象的存储位置,如果该位置没有元素,就存储元素,否则就进入else
红框中if的判断:进入这里代表该位置是有元素的,利用&&把该判断分为两部分。
前一部分,把存入的元素和之前的元素进行哈希值比较,
1. 如果哈希值不同,会继续向下执行,进入其他判断,把元素添加到集合中。
后一部分,前面哈希值比较相同的话,则会进入后一部分
2. 如果哈希值相同,会调用对象的equals()方法比较进行比较,
2.1 如果返回false,会继续向下执行,把元素添加到集合。
2.2 如果返回true,说明有该元素重复,不存储。
4.图解
总结
到这里,HashSet集合保证元素唯一性的源码的简单分析就已经分析完了。
如有不足之处请指出



