HashSet是实现了set接口的一种查询快,存储数据不可重复的集合,再JDK1.7之前底层使用数组+链表实现对数据的操作,JDK1.8之后底层同样使用到数组+链表,但与1.7不同的是新增了红黑树,当链表长度超过阈值(8)时,将链表转为红黑树,这样做个目的主要时减少查找事件。
HashSet的使用
HashSet<String> set = new HashSet<>();
存储数据的原理
HashSet再创建时,底层数组的默认长度时16,
当调用set.add(str),add会调用str的hashCode方法,计算字符串str的哈希值,列如str的哈希值为 9875485,这时候方法会再集合中找有没有9875485这个哈希值的元素,发现没有,就会把str存储到集合中。
这个时候如果创建一个str2,并且str2.equals(str) == true, 再调用set.add(str2),方法同样重复上一步操作,求出str2的哈希值得到9875485,再查询集合发现该哈希值已经存在,这个时候str2会调用equals和srt进行比较,返回值如果为true则将不进行值存储,如果为false,则将str2存放到插入到对应9875485哈希值对应的链表下。该插入在JDK1.7之前采用的是头插入法,1.8之后采用尾插入法。
本文深入解析了HashSet数据结构的工作原理,包括其在JDK1.7和1.8中的实现差异,以及如何通过哈希码和equals方法确保数据的唯一性。详细介绍了HashSet的存储机制,从数组和链表到红黑树的转换条件,提供了清晰的存储流程说明。
9717

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



