java 集合进阶之Collection - Set - HashSet 哈希值 哈希表

HashSet集合概述和特点

1.底层数据结构是哈希表

2.不能保证存储和取出的顺序完全一致

3.没有带索引的方法,所以不能使用普通for循环遍历

4.由于是Set集合 所以元素唯一

哈希值(哈希码值)

是JDK根据对象的地址或者属性值,算出来的int类型的整数

Object 类中有一个方法可以获取对象的哈希值

public int hashCode():根据对象的地址值算出来的哈希值

对象的哈希值特点

1.如果没有重写hashCode方法,那么是根据对象的地址值计算出的哈希值。

同一个对象多次调用hashCode()方法返回的哈希值是相同的

2.如果重写了 hashCode方法,一般都是通过对象的属性值计算出哈希值

如果不同对象属性值一样,那么计算出来的哈希值也是一样的

如果HashSet 集合要存储自定义对象。一定要在类里重写equals 跟 hashCode方法,避免输入的数据重复

常见数据结构之哈希表

JDK8 之前 底层采用数组+链表实现

JDK8以后 底层进行了优化 由数组+链表+红黑树实现

HashSet1.7 版本原理解析 

HashSet<String> hm = new HashSet<>();

1.创建一个默认长度16,默认加载因为0.75(当数组里存了16*0.75=12个元素的时候,数组会扩容成原来的两倍)的数组 ,数组名table

2.添加元素时首先计算元素的哈希值,根据哈希值判断该在哪里存入元素

3.判断当前位置是否为null,如果是null直接存入

4.如果应存入的位置不是null,表示有元素,则调用equals方法比较属性值

5.如果一样,则不存,如果不一样则存入数组,老元素挂在新元素下面。形成链表

HashSet1.8版本原理解析 

底层:哈希表 (数组链表红黑树结合)

当挂在下面的元素过多,不利于添加,也不利于查询

当链表长度超过8的时候,会将链表转换为红黑树

存储流程:计算哈希值——计算应存入的索引——判断是否为空,为空直接存,不为空则根据是链表还是红黑树,用equals方法比较属性值然后判断存入位置

Set集合小结  

Set 特点 无需无索引不可重复

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值