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相关推荐

  1. 【Java源码分析】LinkedHashSet和HashSet源码分析

    类的定义 public class HashSet<E> extends AbstractSet<E> implements Set<E>, Cloneable, ...

  2. HashSet源码分析

    HashSet底层是HashMap实现的,关于HashMap的分析请移步到HashMap源码分析 属性 //底层使用HashMap来实现 private transient HashMap<E, ...

  3. java ee是什么_死磕 java集合之HashSet源码分析

    问题 (1)集合(Collection)和集合(Set)有什么区别? (2)HashSet怎么保证添加元素不重复? (3)HashSet是否允许null元素? (4)HashSet是有序的吗? (5) ...

  4. 【Java入门提高篇】Day26 Java容器类详解(八)HashSet源码分析

    前面花了好几篇的篇幅把HashMap里里外外说了个遍,大家可能对于源码分析篇已经讳莫如深了.别慌别慌,这一篇来说说集合框架里最偷懒的一个家伙--HashSet,为什么说它是最偷懒的呢,先留个悬念,看完 ...

  5. 【阅读源码系列】ConcurrentHashMap源码分析(JDK1.7和1.8)

    个人学习源码的思路: 使用ctrl+单机进入源码,并阅读源码的官方文档–>大致的了解一下此类的特点和功能 使用ALIT+7查看类中所有方法–>大致的看一下此类的属性和方法 找到重要方法并阅 ...

  6. ThreadLocal 源码分析(JDK1.8)

    ThreadLocal 为线程提供了线程本地变量,不同于其他的变量,线程本地变量是通过 get() 和 set() 方法.ThreadLocal 通常是一个私有静态域,与Thread中的某个状态相关联 ...

  7. ThreadLocal源码分析(jdk1.8)

    ThreadLocal,从名字上可以知道和线程本地有关系,这个类会为每个线程提供属于线程自己的局部变量.ThreadLocal可以通过initialValue()为每个线程赋值,也可以由线程自己调用T ...

  8. HashSet源码分析:JDK源码系列

    1.简介 继续分析源码,上一篇文章把HashMap的分析完毕.本文开始分析HashSet简单的介绍一下. HashSet是一个无重复元素集合,内部使用HashMap实现,所以HashMap的特征耶继承 ...

  9. ConcurrentHashMap的源码分析-JDK1.7和Jdk1.8版本的变化

    ConcurrentHashMap和HashMap的实现原理是差不多的,但是因为ConcurrentHashMap需要支持并发操作,所以在实现上要比hashmap稍微复杂一些. 在JDK1.7的实现上 ...

最新文章

  1. TVM性能评估分析(二)
  2. snowflake mysql_snowflake数据库
  3. 实验4.1 循环控制 一
  4. Vector的使用方法和自我理解
  5. SQL Server表的数据量大小查询
  6. 【蓝桥杯】子串分值---笔记
  7. lj245a引脚功能图_技术文章—教你快速读懂单片机时序图
  8. 《SAP 传奇人物》系列人物故事:看透生死远没有操作0和1那么简单
  9. android sdk64位资源,android SDK 有32位或64位的分别吗
  10. Linux命令应用大词典-第 15章 文件、目录权限和属性
  11. Linux设备中的并发控制
  12. Bloom Filter布隆过滤器
  13. 在Exchange Server 2007中修改邮件接受域
  14. SQLServer常用SQL语句
  15. 系泊系统悬链线matlab,基于悬链线方程的系泊系统状态分析
  16. bigworld引擎
  17. IIC原理超详细讲解---值得一看
  18. ❤️工作半年前端的一些思考 | 共勉
  19. 这篇文章告诉你PDF转WORD免费软件有哪些?
  20. 北京地铁线路规划程序

热门文章

  1. 网站建设ASP中UTF-8与GB2312编码转换乱码问题的解决方法
  2. 支付宝二面:Mybatis 接口 Mapper 内的方法为啥不能重载吗?我直接懵逼了。。。
  3. 关于高并发,我想告诉你这些!
  4. 我司用了 6 年的 Redis 分布式限流器,很牛逼了!
  5. Spring 中的统一异常处理
  6. 弹幕,你知道是怎样练成的?
  7. 从程序员到CTO都应该了解的一些技术趋势
  8. Intellij IDEA神器居然还有这些小技巧
  9. 网络:HTTP状态码
  10. linux递归赋权限,Linux下递归更改文件夹和子文件夹的权限