Java记录 -70- HashSet源码剖析
来源:互联网 发布:mysql float 转换int 编辑:程序博客网 时间:2024/05/29 17:53
HashSet不包含重复元素,由哈希表支持。
下面我就开始剖析下HashSet的源代码:
首先从构造方法开始;
private transient HashMap<E,Object> map; public HashSet() { map = new HashMap<E,Object>(); } public HashSet(Collection<? extends E> c) { map = new HashMap<E,Object>(Math.max((int) (c.size()/.75f) + 1, 16)); addAll(c); } public HashSet(int initialCapacity, float loadFactor) { map = new HashMap<E,Object>(initialCapacity, loadFactor); } public HashSet(int initialCapacity) { map = new HashMap<E,Object>(initialCapacity); }
我们会惊奇的发现,HashSet的构造函数中竟然都做了HashMap的构造,直接使用HashMap。可是HashMap是键值映射的,HashSet是存对象的,这都可以吗?带着这个问题,我们接着向下看:
// Dummy value to associate with an Object in the backing Map private static final Object PRESENT = new Object(); public Iterator<E> iterator() { return map.keySet().iterator(); } public int size() { return map.size(); } public boolean isEmpty() { return map.isEmpty(); } public boolean contains(Object o) { return map.containsKey(o); } public boolean add(E e) { return map.put(e, PRESENT)==null; } public boolean remove(Object o) { return map.remove(o)==PRESENT; } public void clear() { map.clear(); }
由上面的一系列方法可以看出,HashSet就是一个壳啊,内部都是调用了HashMap的方法来实现。
add方法是将要添加的元素作为HashMap的key添加的,HashMap的key不能重复,这样HashSet的元素也就不会重复了,高明啊。那么HashMap的值又存的什么呢?PRESENT,一个静态的,Object类型的变量。这个HashMap中key存放了HashSet要存放的元素,而value则存放了统一的一个静态的Object变量。这个PRESENT为什么要static final的呢?省空间呗。
如此看来,HashSet的实现好简单啊,完全借用了HashMap来构造使用,所有的实现都交给了HashMap。HashMap又是怎么实现的呢?让我们期待HashMap源代码的剖析。
阅读全文
0 0
- Java记录 -70- HashSet源码剖析
- java HashSet源码简单剖析
- 【Java深入】HashSet源码剖析
- Java集合HashSet源码剖析
- java.util.hashSet的源码剖析
- Java HashSet和HashMap源码剖析
- Java HashSet和HashMap源码剖析
- Java HashSet和HashMap源码剖析
- Java HashSet和HashMap源码剖析
- HashSet源码剖析
- Java 集合框架 HashSet 和 HashMap 源码剖析
- Java 集合框架-HashSet 和 HashMap 源码剖析
- java-基础-hashset剖析
- 【java集合框架源码剖析系列】java源码剖析之HashSet
- Java记录 -46- ArrayList源码剖析
- Java记录 -49- LinkedList源码剖析
- Java记录 -71- HashMap源码剖析
- 【Java源码】HashSet、LinkedHashSet
- Java记录 -66- 策略模式
- Java记录 -67- 深入剖析Collections的sort方法
- Java记录 -68- Java实现策略模式
- ML-朴素贝叶斯
- Java记录 -69- Comparable与Comparator的区别
- Java记录 -70- HashSet源码剖析
- Java记录 -71- HashMap源码剖析
- Java知识链整理
- java集合---视图与包装器
- 知识链-源码分析
- 知识链-Java集合
- php不用eval实现字符串转数组
- 知识链-Java多线程并发
- 知识链-Java内存管理