一篇文章教你看懂HashSet

本文详细介绍了HashSet的底层结构,它采用数组加链表(以及在JDK1.8后的红黑树)的形式,当数组长度达到一定条件时会转换为红黑树。HashSet的特点在于其增删速度介于链表和数组之间,查询速度也介于两者之间。存储过程中,使用对象的hashcode和equals方法确定存储位置,通过重写这两个方法实现去重。遵循Java Bean规范,即使hashcode相同,equals不相同的对象也可以存放在同一索引下,但equals相同的对象必须有相同的hashcode并存放在同一位置。
摘要由CSDN通过智能技术生成

HashSet

底层结构

数组加上链表的结构,在jdk1.8后再加上红黑树;

如果数组长度大于8或者总元素长度大于64,则转化为红黑树

image-20210906172130372

如图所示如上的数组中存储的都是一个节点对象,没有则指向空,如果有节点对象会指向下一个节点对象知道null为止

HashSet是由HashMap维护的

特点

增删比链表慢但是比数组快,查询比数组慢但是比链表快

存储语法

  1. 根据对象或者父类的默认的Object中的hashcode方法得到对象的整数表达形式

​ 对象.hashcode()或者Object.hashcode()

  1. 通过获得hashcode的值进行hash算法得到位桶的索引值(即数组的索引值)

​ 最简单的hash算法是hashcode%数组长度=位桶索引值

  1. 存储

​ 1)如果该索引值指向null则将要添加的数据添加到此为止,此数据则为头节点

​ 2)如果该索引值指向下一个节点值,则意味者个数组位置有值,则依次比较直到指向null(通过重写hash方法和equals方法判断两个对象是否相等,这里的相等意味着对象的内容相等,而不是地址相等),在最后添加内容

hashcode与equals

<
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值