HashSet底层!万万没想到啊

本文深入探讨了HashSet的底层实现原理,揭示了HashSet实际上是基于HashMap构建的,利用哈希表存储无重复元素。文章详细解析了JDK1.8中哈希表的数组+链表+红黑树实现方式,以及当链表长度超过阈值时如何转换为红黑树以提高查找效率。同时,介绍了HashSet迭代器的使用方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近在家闲来无事,重写看了下java基础和底层,真的是涨知识了!!hashSet底层竟然是hashMap!!

首先

hashSet是一个单链集合,存储无序不能有重复元素,但他的底层却是一个双链集合!简直是无稽之谈呀,但事实就是这样;

顺带一提,hashSet底层是基于哈希表存储的:
JDK1.8中,哈希表存储采用数组+链表+红黑树实现,同一hash值的链表都存储在一个链表里。但是当位于一个桶中的元素较多,即hash值相等的元素较多时,通过key值依次查找的效率较低。当链表长度超过阈值(8)时,将链表转换为红黑树,这样大大减少了查找时间。
在这里插入图片描述图是网上找的,我觉得可以清楚形象的表现出文字解释

回到正题

在这里插入图片描述看到没有,当创建hashSet的时候底层真的是创建了一个HashMap,这个map的key就是你添加的值,value是默认的一个空对象

当你执行添加操作的时候,会默认把空对象作为value传进去,我想这也就是为什么hashset不可重复的原因吧,毕竟添加的时候,底层调用的是map的put方法,传入的值作为key,而map的key是唯一的
在这里插入图片描述
不过呢,如果你的key的类型是自定义类型的时候必须重写equals方法和hashCode方法

还有一点就是,HashSet没有提供get()方法,因为Set内部是无序的,只能通过迭代的方式获得

迭代器使用

public class hashSetDemo {
    public static void main(String[] args) {
        HashSet<String> set = new HashSet<>();
        set.add("aaa");
        set.add("bbb");
        set.add("bbb");
        set.add("ccc");
        set.add("ddd");
        //迭代器
        Iterator<String> iterator = set.iterator();
        while (iterator.hasNext()){
            System.out.println(iterator.next());
        }
        //[aaa, ccc, bbb, ddd],无序不重复
        System.out.print(set);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值