HashSet源码分析 jdk1.6
Set的特点:Set元素无顺序,且元素不可以重复。
1、定义
public class HashSet<E> extends AbstractSet<E> implements Set<E>, Cloneable, java.io.Serializable
Set接口定义:
public interface Set<E> extends Collection<E> {// Query Operationsint size();boolean isEmpty();boolean contains(Object o);Iterator<E> iterator();Object[] toArray();<T> T[] toArray(T[] a);// Modification Operationsboolean add(E e);boolean remove(Object o);// Bulk Operationsboolean containsAll(Collection<?> c);boolean addAll(Collection<? extends E> c);boolean retainAll(Collection<?> c);boolean removeAll(Collection<?> c);void clear();// Comparison and hashingboolean equals(Object o);int hashCode(); }
2、底层存储
// 底层使用HashMap来保存HashSet的元素private transient HashMap<E,Object> map;// Dummy value to associate with an Object in the backing Map// 由于Set只使用到了HashMap的key,所以此处定义一个静态的常量Object类,来充当HashMap的value//用于避免java.lang.NullPointerException异常private static final Object PRESENT = new Object();
3、构造方法
/*** 使用HashMap的默认容量大小16和默认加载因子0.75初始化map,构造一个HashSet*/public HashSet() {map = new HashMap<E,Object>();}/*** 构造一个指定Collection参数的HashSet,这里不仅仅是Set,只要实现Collection接口的容器都可以*/public HashSet(Collection<? extends E> c) {map = new HashMap<E,Object>(Math. max((int) (c.size()/.75f) + 1, 16));// 使用Collection实现的Iterator迭代器,将集合c的元素一个个加入HashSet中 addAll(c);}/*** 使用指定的初始容量大小和加载因子初始化map,构造一个HashSet*/public HashSet( int initialCapacity, float loadFactor) {map = new HashMap<E,Object>(initialCapacity, loadFactor);}/*** 使用指定的初始容量大小和默认的加载因子0.75初始化map,构造一个HashSet*/public HashSet( int initialCapacity) {map = new HashMap<E,Object>(initialCapacity);}/*** 不对外公开的一个构造方法(默认default修饰),底层构造的是LinkedHashMap,dummy只是一个标示参数,无具体意义*/HashSet( int initialCapacity, float loadFactor, boolean dummy) {map = new LinkedHashMap<E,Object>(initialCapacity, loadFactor); }
4、增加和删除
/*** 利用HashMap的put方法实现add方法*/public boolean add(E e) {return map .put(e, PRESENT)== null;}/*** 利用HashMap的remove方法实现remove方法*/public boolean remove(Object o) {return map .remove(o)==PRESENT;}/*** 添加一个集合到HashSet中,该方法在AbstractCollection中*/public boolean addAll(Collection<? extends E> c) {boolean modified = false;// 取得集合c迭代器IteratorIterator<? extends E> e = c.iterator();// 遍历迭代器while (e.hasNext()) {// 将集合c的每个元素加入到HashSet中if (add(e.next()))modified = true;}return modified;}/*** 删除指定集合c中的所有元素,该方法在AbstractSet中*/public boolean removeAll(Collection<?> c) {boolean modified = false;// 判断当前HashSet元素个数和指定集合c的元素个数,目的是减少遍历次数if (size() > c.size()) {// 如果当前HashSet元素多,则遍历集合c,将集合c中的元素一个个删除for (Iterator<?> i = c.iterator(); i.hasNext(); )modified |= remove(i.next());} else {// 如果集合c元素多,则遍历当前HashSet,将集合c中包含的元素一个个删除for (Iterator<?> i = iterator(); i.hasNext(); ) {if (c.contains(i.next())) {i.remove();modified = true;}}}return modified; }
Hashset的很多地方就是利用 hashmap的key实现的
转载于:https://www.cnblogs.com/L-a-u-r-a/p/8540828.html
HashSet源码分析 jdk1.6相关推荐
- 【Java源码分析】LinkedHashSet和HashSet源码分析
类的定义 public class HashSet<E> extends AbstractSet<E> implements Set<E>, Cloneable, ...
- HashSet源码分析
HashSet底层是HashMap实现的,关于HashMap的分析请移步到HashMap源码分析 属性 //底层使用HashMap来实现 private transient HashMap<E, ...
- java ee是什么_死磕 java集合之HashSet源码分析
问题 (1)集合(Collection)和集合(Set)有什么区别? (2)HashSet怎么保证添加元素不重复? (3)HashSet是否允许null元素? (4)HashSet是有序的吗? (5) ...
- 【Java入门提高篇】Day26 Java容器类详解(八)HashSet源码分析
前面花了好几篇的篇幅把HashMap里里外外说了个遍,大家可能对于源码分析篇已经讳莫如深了.别慌别慌,这一篇来说说集合框架里最偷懒的一个家伙--HashSet,为什么说它是最偷懒的呢,先留个悬念,看完 ...
- 【阅读源码系列】ConcurrentHashMap源码分析(JDK1.7和1.8)
个人学习源码的思路: 使用ctrl+单机进入源码,并阅读源码的官方文档–>大致的了解一下此类的特点和功能 使用ALIT+7查看类中所有方法–>大致的看一下此类的属性和方法 找到重要方法并阅 ...
- ThreadLocal 源码分析(JDK1.8)
ThreadLocal 为线程提供了线程本地变量,不同于其他的变量,线程本地变量是通过 get() 和 set() 方法.ThreadLocal 通常是一个私有静态域,与Thread中的某个状态相关联 ...
- ThreadLocal源码分析(jdk1.8)
ThreadLocal,从名字上可以知道和线程本地有关系,这个类会为每个线程提供属于线程自己的局部变量.ThreadLocal可以通过initialValue()为每个线程赋值,也可以由线程自己调用T ...
- HashSet源码分析:JDK源码系列
1.简介 继续分析源码,上一篇文章把HashMap的分析完毕.本文开始分析HashSet简单的介绍一下. HashSet是一个无重复元素集合,内部使用HashMap实现,所以HashMap的特征耶继承 ...
- ConcurrentHashMap的源码分析-JDK1.7和Jdk1.8版本的变化
ConcurrentHashMap和HashMap的实现原理是差不多的,但是因为ConcurrentHashMap需要支持并发操作,所以在实现上要比hashmap稍微复杂一些. 在JDK1.7的实现上 ...
最新文章
- TVM性能评估分析(二)
- snowflake mysql_snowflake数据库
- 实验4.1 循环控制 一
- Vector的使用方法和自我理解
- SQL Server表的数据量大小查询
- 【蓝桥杯】子串分值---笔记
- lj245a引脚功能图_技术文章—教你快速读懂单片机时序图
- 《SAP 传奇人物》系列人物故事:看透生死远没有操作0和1那么简单
- android sdk64位资源,android SDK 有32位或64位的分别吗
- Linux命令应用大词典-第 15章 文件、目录权限和属性
- Linux设备中的并发控制
- Bloom Filter布隆过滤器
- 在Exchange Server 2007中修改邮件接受域
- SQLServer常用SQL语句
- 系泊系统悬链线matlab,基于悬链线方程的系泊系统状态分析
- bigworld引擎
- IIC原理超详细讲解---值得一看
- ❤️工作半年前端的一些思考 | 共勉
- 这篇文章告诉你PDF转WORD免费软件有哪些?
- 北京地铁线路规划程序