Java集合源码:(六) HashSet源码解析JDK8)

HashSet概述

对于HashSet而言,它是基于HashMap实现的,HashSet底层使用HashMap来保存所有元素,因此HashSet 的实现比较简单,相关HashSet的操作,基本上都是直接调用底层HashMap的相关方法来完成,其实看过了HashMap源码的同学,就会发现HashSet的实现好简单,如果没有看过关于HashMap的源码解析的,可以看我的另一篇博客:

HashSet特点

非线程安全允许null值添加值得时候会先获取对象的hashCode方法,如果hashCode 方法返回的值一致,则再调用equals方法判断是否一致,如果不一致才add元素。

注意: 对于HashSet中保存的对象,请注意正确重写其equals和hashCode方法,以保证放入的对象的唯一性。

HashSet源码

hashset就一个重要的成员变量:

// 真正实现存储功能的map , HashSet的值就是存到HashMap的key中,所以不可重复 private transient HashMap<E,Object> map; // HashMap的value, 一个虚拟值,无用 private static final Object PRESENT = new Object(); //构造函数 public HashSet() { map = new HashMap<>(); }

add源码:

public boolean add(E e) { return map.put(e, PRESENT)==null; }

将元素存到内部HashMap的key中,而值就是一个空的Object对象。所以HashSet特点是不可重复。

remove源码:

public boolean remove(Object o) { return map.remove(o)==PRESENT; }

同add方法,不必讲。类似的还有下面:

public Iterator<E> iterator() { return map.keySet().iterator(); } public int size() { return map.size(); } public boolean isEmpty() { return map.isEmpty(); }

© 版权声明
THE END
喜欢就支持一下吧
点赞11 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片