JDK 源码解析 —— HashSet
2016-05-06 10:41
441 查看
零. 简介
这个类实现了 Set 接口,内部是由 HashMap 实例辅助实现的。它不保证元素的顺序,数据允许为 null。
假如 hash 方法将数据分散地比较合理,比如一个 bucket 一个数据,那么 add、remove、contains、size 性能开销是常数时间。
这个类非线程安全的,如果多线程并发访问,并且至少一个线程在做修改操作,那么必须在外部做好同步处理。例如使用:Set s = Collections.synchronizedSet(new HashSet(...));
一. 源码解析(JDK1.7 源码)
类结构:实现了 Set 接口,Set 特征是没有重复元素,因为 key 在 HashMap 中是唯一的,所以本类把元素放到 HashMap 的 key 中,就可以保证没有重复元素
构造函数:可以看出数据是存在 HashMap 里的
看下 Set 接口需要实现的方法
add 方法:利用 HashMap put 方法的特点,put 成功会返回旧的 value 值,所以 add 一个没有重复的数据,那么返回的旧值必然是 null,所以 add 就 return true 说明插入成功,否则说明插入的值已经存在,插入失败
remove 方法:利用 HashMap 的 remove 方法,如果删除成功就返回当前被 remove key 所对应的 value,因为存的 value 都是 PRESENT,所以删除成功则返回 true
二. 总结
HashSet 依赖 HashMap 的已实现的方法来实现的,所以看懂 HashSet 的前提是看懂 HashMap。
这个类实现了 Set 接口,内部是由 HashMap 实例辅助实现的。它不保证元素的顺序,数据允许为 null。
假如 hash 方法将数据分散地比较合理,比如一个 bucket 一个数据,那么 add、remove、contains、size 性能开销是常数时间。
这个类非线程安全的,如果多线程并发访问,并且至少一个线程在做修改操作,那么必须在外部做好同步处理。例如使用:Set s = Collections.synchronizedSet(new HashSet(...));
一. 源码解析(JDK1.7 源码)
类结构:实现了 Set 接口,Set 特征是没有重复元素,因为 key 在 HashMap 中是唯一的,所以本类把元素放到 HashMap 的 key 中,就可以保证没有重复元素
public class HashSet<E> extends AbstractSet<E> implements Set<E>, Cloneable, java.io.Serializable
构造函数:可以看出数据是存在 HashMap 里的
private transient HashMap<E,Object> map; public HashSet() { map = new HashMap<>(); }
看下 Set 接口需要实现的方法
add 方法:利用 HashMap put 方法的特点,put 成功会返回旧的 value 值,所以 add 一个没有重复的数据,那么返回的旧值必然是 null,所以 add 就 return true 说明插入成功,否则说明插入的值已经存在,插入失败
public boolean add(E e) { return map.put(e, PRESENT)==null; }
remove 方法:利用 HashMap 的 remove 方法,如果删除成功就返回当前被 remove key 所对应的 value,因为存的 value 都是 PRESENT,所以删除成功则返回 true
public boolean remove(Object o) { return map.remove(o)==PRESENT; }
二. 总结
HashSet 依赖 HashMap 的已实现的方法来实现的,所以看懂 HashSet 的前提是看懂 HashMap。
相关文章推荐
- java 读取图片文件再生成新图片
- 【URLDecoder】java.lang.IllegalArgumentException: URLDecoder: Illegal hex characters in es
- ValueStack与Struts2标签-day5
- java中根据hibernate配置文件自动建表
- Java练习题
- 蓝桥杯 幂一矩阵 2014年JavaB组决赛第5题
- springMVC dao层中通过反射获取entityClass
- java I/O(一)——基本操作&&java.util.zip压缩
- Java虚拟机参数设置问题
- Java Future和Callable介绍
- Java多线程之wait(),notify(),notifyAll()
- JAVA来读取大文本文件
- Java问题汇总
- Springlake-01 介绍&功能&安装
- Java web 开发环境配置
- Eclipse默认配色的恢复方法
- Spring4 整合 Hibernate3 基本使用(通过注入 SessionFactory)
- 69道Spring面试题和答案
- 69道Spring面试题和答案
- Java 中 List 与 HashSet 的对比