当前位置: 首页 > 科技观察

HashSet集合,从入门到精通_0

时间:2023-03-21 00:52:30 科技观察

大家好,我是北君。本文参考北军介绍一个集合——HashSet,也是现在面试必问的集合。它通常用于存储不能重复的数据。可以说这个集合是HashMap的儿子。你为什么这么说?看完你就会明白,在JDK1.8中,HashMap是由数组+链表+红黑树组成的。与早期版本的JDKHashMap实现相比,增加了红黑树作为底层数据结构。当哈希冲突较多时,可以大大提高检索效率。了解了HashMap的具体实现之后,我们来介绍一个作为底层数据结构的HashMap实现的数据结构——HashSet。(如果不了解HashMap的实现原理,建议先看HashMap,否则直接看HashSet很难理解)。一、HashSet定义HashSet是由HashMap实现的集合。元素是无序的,不能重复。publicclassHashSetextendsAbstractSetimplementsSet,Cloneable,java.io.Serializable和上面介绍的大多数集合一样,HashSet也实现了Cloneable接口和Serializable接口,用于支持克隆和序列化。还实现了Set接口,该接口为Set集合类型定义了一组规范。2.Field属性//HashSet集合中的内容是通过HashMap数据结构存储的私有瞬态HashMap映射;//向HashSet中添加数据,上面map结构中的数据作为key存在,且value都是PRESENTprivatestaticfinalObjectPRESENT=newObject();第一个定义了一个HashMap作为实现HashSet的数据结构;第二个PRESENT对象,因为前面说了HashMap是作为键值对key-value存储的,而HashSet不是键值对,那么选择HashMap作为实现。其原理是将存储在HashSet中的数据作为Map的key,Map的value统一为PRESENT(下面介绍具体实现时你就会明白)。3.构造函数①构造无参publicHashSet(){map=newHashMap<>();}直接新建一个HashMap对象,使用HashMap的构造函数不带参数,默认初始容量(16)和加载因子(0.75)。②指定初始容量publicHashSet(intinitialCapacity){map=newHashMap<>(initialCapacity);}③指定初始容量和加载因子publicHashSet(intinitialCapacity,floatloadFactor){map=newHashMap<>(initialCapacity,loadFactor);}④构建publicHashSet(Collectionc){map=newHashMap<>(Math.max((int)(c.size()/.75f)+1,16));添加所有(c);}收集容量很容易理解,这里我就介绍一下什么是负载因子。在HashMap中,可以存储的元素个数为:总容量*加载因子。在添加元素时,如果HashMap集合中的元素大于前面公式计算出的结果,那么就要进行扩容操作,从时间和空间上考虑,默认加载因子一般为0.75。4.添加元素publicbooleanadd(Ee){returnmap.put(e,PRESENT)==null;}通过map.put()方法添加元素,在一篇博客介绍该方法时,说明如果新插入的key不存在,该方法返回null,如果新插入的key存在,则返回对应的值到原始键(注意新插入的值将覆盖原始值)。也就是说,HashSet的add(Ee)方法会将e作为key,PRESENT作为value插入到map集合中。如果e不存在,则插入成功返回true;如果存在,它将返回false。5.删除元素publicbooleanremove(Objecto){returnmap.remove(o)==PRESENT;}调用HashMap的remove(Objecto)方法,该方法会先检查map集合中是否存在o,存在则删除,并返回值,不存在则返回null。也就是说HashSet的remove(Objecto)方法如果删除成功则返回true,如果删除的元素不存在则返回false。6.找到元素publicbooleancontains(Objecto){returnmap.containsKey(o);}调用HashMap的containsKey(Objecto)方法,找到则返回true,找不到则返回false。7.遍历元素HashSetset=newHashSet<>();set.add(1);set.add(2);//增强for循环for(Integeri:set){System.out.println(i);}//普通for循环Iteratoriterator=set.iterator();while(iterator.hasNext()){System.out.println(iterator.next());}8.总结完毕,这是JDK中java.util.HashSet类的介绍。指北军,奏千曲而知音,观千剑而知兵器。感谢大家的点赞、收藏和评论,我们下一期会更精彩!