详解Java集合中的HashSet
来源:Java互联网架构师     阅读:565
熊掌科技
发布于 2018-09-27 23:13
查看主页

简述

在写HashMap的时候提到过Set是基于Map实现的,HashSet基于HashMap实现,将HashSet的数据作为HashMap的Key值保存,所以HashSet中元素不可重复,无序,允许null元素,线程不安全。

源码分析

HashSet字段

//基于HashMap实现

private transient HashMap map;

//虚拟一个value

private static final Object PRESENT = new Object();

构造方法

/**

* 默认无参构造,初始化了一个空的HashMap

*/

public HashSet() {

map = new HashMap<>();

}

/**

* 指定容量构造

*/

public HashSet(int initialCapacity) {

map = new HashMap<>(initialCapacity);

}

/**

* 指定容量和负载因子

*/

public HashSet(int initialCapacity, float loadFactor) {

map = new HashMap<>(initialCapacity, loadFactor);

}

/**

* 指定容量、负载因子构造一个新的集合,非public有访问权限

* 只有LinkedHashSet涉及到

*/

HashSet(int initialCapacity, float loadFactor, boolean dummy) {

map = new LinkedHashMap<>(initialCapacity, loadFactor);

}

/**

* 指定collection集合构造

*/

public HashSet(Collection c) {

map = new HashMap<>(Math.max((int) (c.size()/.75f) + 1, 16));

addAll(c);

}

从这里我们可以看出HashSet基于HashMap实现

add方法

用HashMap的put方法完成HashSet的add操作,由于HashMap的key不可重复,所以HashSet中的元素不会重复,源码如下

public boolean add(E e) {

return map.put(e, PRESENT)==null;

}

remove方法

调用HashMap的remove方法

public boolean remove(Object o) {

return map.remove(o)==PRESENT;

}

contains方法

由于HashSet的元素都作为HashMap的Key值保存,所以查询能否包含此key

public boolean contains(Object o) {

return map.containsKey(o);

}

迭代

获取HashMap的KeySet的迭代器

public Iterator iterator() {

return map.keySet().iterator();

}

clone方法

属于浅克隆

public Object clone() {

try {

HashSet newSet = (HashSet) super.clone();

newSet.map = (HashMap) map.clone();

return newSet;

} catch (CloneNotSupportedException e) {

throw new InternalError(e);

}

}

总结

HashSet基于HashMap实现,与HashMap一样无序,线程不安全,利用HashMap的key不可重复从而实现HashSet不含重复元素


写在最后:欢迎留言探讨,点“关注”,不迷路,加关注,持续升级!

免责声明:本文为用户发表,不代表网站立场,仅供参考,不构成引导等用途。 系统环境 服务器应用
相关推荐
CSS 单位
【HTML】替换元素与非替换元素
iOS 组件化-路由解耦思想 JLRoutes 实战篇(一)App内控制器跳转
C语言入门这一篇就够了---学习笔记+资料
小老弟自学Python一个月,就开发了一个可上线的BBS论坛,真牛逼
首页
搜索
订单
购物车
我的