欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

HashSet底层!万万没想到啊

程序员文章站 2024-03-18 20:20:10
...

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

首先

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

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

回到正题

HashSet底层!万万没想到啊看到没有,当创建hashSet的时候底层真的是创建了一个HashMap,这个map的key就是你添加的值,value是默认的一个空对象

当你执行添加操作的时候,会默认把空对象作为value传进去,我想这也就是为什么hashset不可重复的原因吧,毕竟添加的时候,底层调用的是map的put方法,传入的值作为key,而map的key是唯一的
HashSet底层!万万没想到啊
不过呢,如果你的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);
    }
}
相关标签: Java java hash