HashSet底层!万万没想到啊
程序员文章站
2024-03-18 20:20:10
...
最近在家闲来无事,重写看了下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);
}
}
上一篇: Flask中制作博客首页的分类功能(一)