HashSet源码分析
2019-07-24 17:50
60 查看
版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_42191317/article/details/96752953
HashSet类图
HashSet是java.util包下Set接口下的一个集合子类,他是无序、不可重复、线程不安全的。底层是通过HashMap实现的。
- AbstractSet类:Set的默认实现抽象类,定义了Set的一些通用方法。
- Cloneable接口:实现对象拷贝必须要实现的接口。
- Serializable接口:实现序列化必须要实现的接口。
- Set接口:Set集合的顶级接口。
HashSet属性
HashSet的属性如上所示,下面一一分析:
serialVersionUID
[code] static final long serialVersionUID = -5024744406713321676L;
序列化ID
map
[code] private transient HashMap<E,Object> map;
用HashMap来存储数据,transient修饰,不可被序列化,他是通过重写readObject和writeObject方法来实现序列化的
PRESENT
[code] private static final Object PRESENT = new Object();
用来填充HashMap里的value,一个static、fianl修饰的Object对象。
HashSet常用API
[code] 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 HashSet(Collection<? extends E> c) { map = new HashMap<>(Math.max((int) (c.size()/.75f) + 1, 16)); addAll(c); }
构造函数
- 空参:直接调用HashMap的空参构造,即初始容量为16,负载因子0.75
- 一个参数:传入初始容量大小
- 两个参数:传入初始容量大小和负载因子
- Collection参数:传入一个Collection体系的集合,调用addAll方法将该集合中的元素全部添加进去
[code] public boolean add(E e) { return map.put(e, PRESENT)==null; }
add方法:添加一个元素。直接调用的是HashMap的put方法,value为之前定义的PRESENT。
[code] public boolean remove(Object o) { return map.remove(o)==PRESENT; }
remove方法:移除一个元素,调用HashMap的remove方法去移除该元素,如果返回值和填充的value相等即删除成功。
[code] public void clear() { map.clear(); }
clear方法:清空容器。也是调用HashMap的clear方法去执行。
[code] public int size() { return map.size(); }
size方法:返回容器中元素个数。
[code] public boolean isEmpty() { return map.isEmpty(); }
isEmpty方法:判空。
[code] public boolean contains(Object o) { return map.containsKey(o); }
contains方法:判断是否包含某个元素。
[code] public Iterator<E> iterator() { return map.keySet().iterator(); }
iterator方法:返回一个迭代器。
总结
HashSet是一个无序,不可重复,非线程安全的集合,底层通过HashMap实现,定义一个空Object对象来填充value值,因此它的初始化容量大小、负载因子、扩容等机制和HashMap一致。
参考HashMap:https://blog.csdn.net/qq_42191317/article/details/96480436
相关文章推荐
- Java集合之HashSet源码分析
- java 中的集合(九) HashSet源码分析
- Java面试题 从源码角度分析HashSet实现原理?
- Java集合之HashSet,LinkedHashSet源码分析
- java.util.HashSet源码分析
- HashSet源码分析
- java集合之set集合的实现类HashSet源码分析
- HashSet、LinkedHashSet源码分析
- java 中的集合(十) LinkedHashSet源码分析
- HashSet源码分析
- LinkedHashSet 源码分析
- HashSet和HashMap源码实现分析
- Java集合---HashSet的源码分析
- java HashSet源码分析
- 【Java源码分析】LinkedHashSet和HashSet源码分析
- Java面试题 从源码角度分析HashSet实现原理
- Java集合---HashSet的源码分析
- HashSet源码分析1
- JAVA集合源码分析——HashSet
- Java集合---HashSet的源码分析