HashSet剖析
来源:互联网 发布:老虎机控制器软件下载 编辑:程序博客网 时间:2024/06/06 02:53
对于 HashSet 而言,它是基于 HashMap 实现的,HashSet 底层采用 HashMap 来保存所有元素
public class HashSet<E> extends AbstractSet<E> implements Set<E>, Cloneable, java.io.Serializable { // 使用 HashMap 的 key 保存 HashSet 中所有元素 private transient HashMap<E,Object> map; // 定义一个虚拟的 Object 对象作为 HashMap 的 value private static final Object PRESENT = new Object(); ... // 初始化 HashSet,底层会初始化一个 HashMap public HashSet() { map = new HashMap<E,Object>(); } // 以指定的 initialCapacity、loadFactor 创建 HashSet // 其实就是以相应的参数创建 HashMap public HashSet(int initialCapacity, float loadFactor) { map = new HashMap<E,Object>(initialCapacity, loadFactor); } public HashSet(int initialCapacity) { map = new HashMap<E,Object>(initialCapacity); } HashSet(int initialCapacity, float loadFactor, boolean dummy) { map = new LinkedHashMap<E,Object>(initialCapacity,loadFactor); } // 调用 map 的 keySet 来返回所有的 key public Iterator<E> iterator() { return map.keySet().iterator(); } // 调用 HashMap 的 size() 方法返回 Entry 的数量,就得到该 Set 里元素的个数 public int size() { return map.size(); } // 调用 HashMap 的 isEmpty() 判断该 HashSet 是否为空, // 当 HashMap 为空时,对应的 HashSet 也为空 public boolean isEmpty() { return map.isEmpty(); } // 调用 HashMap 的 containsKey 判断是否包含指定 key //HashSet 的所有元素就是通过 HashMap 的 key 来保存的 public boolean contains(Object o) { return map.containsKey(o); } // 将指定元素放入 HashSet 中,也就是将该元素作为 key 放入 HashMap public boolean add(E e) { return map.put(e, PRESENT) == null; } // 调用 HashMap 的 remove 方法删除指定 Entry,也就删除了 HashSet 中对应的元素 public boolean remove(Object o) { return map.remove(o)==PRESENT; } // 调用 Map 的 clear 方法清空所有 Entry,也就清空了 HashSet 中所有元素 public void clear() { map.clear(); } ... }
由上面源程序可以看出,HashSet 的实现其实非常简单,它只是封装了一个 HashMap 对象来存储所有的集合元素,所有放入 HashSet 中的集合元素实际上由 HashMap 的 key 来保存,而 HashMap 的 value 则存储了一个 PRESENT,它是一个静态的 Object 对象。
我们知道HashMap有一个特点就是,它的key是不允许重复的,所以HashSet将它的value作为HashMap的key进行保存,正好实现了HashSet插入值不可重复的特性。
另外这里要注意了:
将对象存储在HashSet之前,要先确保对象重写equals()和hashCode()方法,这样才能真正确保set中没有储存相等的对象。具体原因可以参看:
HashMap剖析
Java equals和HashCode方法总结
引用:
java中HashSet详解
0 0
- HashSet剖析
- HashSet剖析
- HashSet剖析
- 剖析HASHMAP/HASHSET
- HashSet源代码剖析
- HashSet源码剖析
- java-基础-hashset剖析
- HashMap HashTable HashSet区别剖析
- HashMap HashTable HashSet区别剖析
- HashSet, HashTable,HashMap区别剖析
- java HashSet源码简单剖析
- 【Java深入】HashSet源码剖析
- Java集合HashSet源码剖析
- 深入源码剖析 HashSet、HashMap、HashTable
- 深入集合框架之HashSet源码剖析
- java.util.hashSet的源码剖析
- HashSet的add(E e)方法剖析
- Java HashSet和HashMap源码剖析
- 文章标题
- 使用ByteArrayOutputStream下载文件
- [Wondgirl] 微信小程序(三)模板的使用
- Python实现Tab自动补全和历史命令管理的方法
- 矩阵的求导运算
- HashSet剖析
- 清理keyChain
- ECHART基本使用,折线图,柱状图,散点图,饼图,盒形图5分钟上手
- 使用fetch遇到过的坑
- 使用正则表达式匹配字符串中特定的xml内容
- PHP生成验证码时,出现图像“ http://localhost...”因其本身有错无法显示
- iOS-关于UINavigationController的title不显示问题
- jQuery JS 获取时间函数集 取时间的一部分
- Oracle中不同条件的日期查询