在 jdk1.8 中,hashmap 是由 数组+链表+红黑树构成,相对于早期版本的 jdk hashmap 实现,新增了红黑树作为底层数据结构,在数据量较大且哈希碰撞较多时,能够极大的增加检索的效率。了解 hashmap 的具体实现后,我们再来介绍由 hashmap 作为底层数据结构实现的一种数据结构——hashset。(如果不了解 hashmap 的实现原理,建议先看看 hashmap,不然直接看 hashset 是很难看懂的)。
1、hashset 定义hashset 是一个由 hashmap 实现的集合。元素无序且不能重复。
public class hashset extends abstractset implements set, cloneable, java.io.serializable和前面介绍的大多数集合一样,hashset 也实现了 cloneable 接口和 serializable 接口,分别用来支持克隆以及支持序列化。还实现了 set 接口,该接口定义了 set 集合类型的一套规范。
2、字段属性//hashset集合中的内容是通过 hashmap 数据结构来存储的 private transient hashmap map; //向hashset中添加数据,数据在上面的 map 结构是作为 key 存在的,而value统一都是 present private static final object present = new object();第一个定义一个 hashmap,作为实现 hashset 的数据结构;第二个 present 对象,因为前面讲过 hashmap 是作为键值对 key-value 进行存储的,而 hashset 不是键值对,那么选择 hashmap 作为实现,其原理就是存储在 hashset 中的数据 作为 map 的 key,而 map 的value 统一为 present(下面介绍具体实现时会了解)。
3、构造函数①、无参构造
public hashset() { map = new hashmap(); }直接 new 一个 hashmap 对象出来,采用无参的 hashmap 构造函数,具有默认初始容量(16)和加载因子(0.75)。
②、指定初始容量
public hashset(int initialcapacity) { map = new hashmap(initialcapacity); }③、指定初始容量和加载因子
public hashset(int initialcapacity, float loadfactor) { map = new hashmap(initialcapacity, loadfactor); }④、构造包含指定集合中的元素
public hashset(collection c) { map = new hashmap(math.max((int) (c.size()/.75f) + 1, 16)); addall(c); }集合容量很好理解,这里我介绍一下什么是加载因子。在 hashmap 中,能够存储元素的数量就是:总的容量*加载因子 ,新增一个元素时,如果hashmap集合中的元素大于前面公式计算的结果了,那么就必须要进行扩容操作,从时间和空间考虑,加载因子一般都选默认的0.75。
4、添加元素public boolean add(e e) { return map.put(e, present)==null; }通过 map.put() 方法来添加元素,在上一篇博客介绍该方法时,说明了该方法如果新插入的key不存在,则返回null,如果新插入的key存在,则返回原key对应的value值(注意新插入的value会覆盖原value值)。
也就是说 hashset 的 add(e e) 方法,会将 e 作为 key,present 作为 value 插入到 map 集合中,如果 e 不存在,则插入成功返回 true;如果存在,则返回false。
5、删除元素public boolean remove(object o) { return map.remove(o)==present; }调用 hashmap 的remove(object o) 方法,该方法会首先查找 map 集合中是否存在 o ,如果存在则删除,并返回该值,如果不存在则返回 null。
也就是说 hashset 的 remove(object o) 方法,删除成功返回 true,删除的元素不存在会返回 false。
6、查找元素public boolean contains(object o) { return map.containskey(o); }调用 hashmap 的 containskey(object o) 方法,找到了返回 true,找不到返回 false。
7、遍历元素hashset set = new hashset();set.add(1);set.add(2);//增强for循环for(integer i : set){ system.out.println(i);}//普通for循环iterator iterator = set.iterator();while (iterator.hasnext()){ system.out.println(iterator.next());}8、小结好了,这就是jdk中java.util.hashset 类的介绍。
诸多利好因素推动了共享汽车的发展,无人驾驶是最关键的因素
量子计算对于自动驾驶的发展有无影响
英集芯高集成高性价比电源解决方案芯片IP5516 获唱吧Microbuds1真无线耳机采用
小米8青春版上手体验 没什么可以挑剔的地方
双向dc-dc变换器是什么 双向dcdc变换器原理
JDK中java.util.HashSet 类的介绍
小米平板5曝光 AMD发布锐龙5000G系列桌面APU
IR推出新款PQFN封装功率MOSFET PQFN2x2
零件停产,旧家电没得修?电器售后服务为行业敲响了警钟
MEMS 驶入快车道
新能源汽车解析丨什么是IGBT?结构与拆解
Type-C接口的优势有哪些
臻迪科技的PowerEgg X无人机产品搭载4K/60fps相机
广电的5G网络怎样建设
EDA软件在ARM服务器的应用解析
5路原生千兆网口,让组网更便捷!——TI AM64x
谷歌以人工智能继续驱动攻城略地的新硬件战略
立仪科技|3D工业视觉传感器线光谱应用那些领域
走出智慧电视?手机、家电玩家涌入智慧屏赛道,办公、教育、游戏成为落地新方向
曾经强如苹果的三星,为何在中国市场全面败退?