小白说源码(HashSet)第二期

本文详细解读了HashSet的数据结构特点,如何利用哈希值确定位置,保证元素唯一性的机制,以及为何使用hashCode和equals方法。同时介绍了JDK1.8前后哈希表的变化。最后提到LinkedHashSet的有序特性。

1.HashSet介绍

1.HashSet的特点

  • 无序,无索引,唯一

2.HashSet的根据什么来确定元素位置

  • HashSet是根据对象的哈希值,来确定元素在集合中的存储位置,因此具有良好的存取和查找性能

3.HashSet的底层数据结构

  • HashSet的底层是哈希表

4.什么是哈希表

  • JDK1.8前,哈希表采用数组+链表,就是使用链表来处理哈希冲突,但是当同一个hash值链表的元素较多时,要对链表元素进行操作时效率较低
  • JDK1.8后,哈希表采用数组+链表+红黑树,当同一个hash值上链表的元素超过阈值(8)时,将链表转换为红黑树(二分查找),这样会大大减少元素操作时间
    在这里插入图片描述
    5.Set如何保证元素唯一
  • Set通过hashCode与equals来保证元素唯一
  • HashSet在元素存储前,会根据元素的hashCode方法计算出一个哈希值(代表元素存储位置)
  •   当该哈希值上无元素时,直接将元素存储到该位置
    
  •   若该哈希值上有元素时,此时这种情况为哈希冲突
    
  • 当发生哈希冲突时,再用该元素的equals方法逐个与这个哈希值上的所有元素进行比较
  •   比较结果为真,则该元素已重复
    
  •   比较结果为假,则该元素不重复
    

6.为什么HashSet要用hashCode方法

  • 因为使用hashCode的方法会将元素尽可能的分配在不同的哈希值空间内,可以只进行一个哈希值空间内的元素判断,大大提高效率。

7.为什么HashSet要用equals方法

  • 因为元素进行哈希值运算时,可能会出现哈希冲突,这时需要进行equals判断元素是否相同。

8.补充

  • 虽然HashSet保证元素唯一,但是元素无序,为了实现有序
  • 可以使用HashSet的子类LinkedHashSet,它是链表+哈希表的结构,可以实现数据的有序存取和元素唯一

2.源码剖析

待续…

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值