HashSet(源码解读)

简介: HashSet(源码解读)

HashSet概述

HashSet的代码行数 300多行,是我见过最少代码的集合了,非常简单,它有以下的特点

  • 没有重复元素的集合。底层基于HashMap来实现。
  • 非线程安全,创建线程安全的HashMap可以使用Collections.synchronizedSet。

HashSet源码解读

继承关系

  • 继承AbstractSet抽象类,实现Set接口
  • 实现java.io.Serialization接口,支持序列化
  • 实现Cloneable接口,支持对象克隆,浅复制

属性

     //使用HashMap来保存HashSet的元素
    private transient HashMap<E,Object> map;

    //HashSet只使用到key,因此使用一个静态常量来充当HashSet的value值
    private static final Object PRESENT = new Object();
复制代码

构造方法

  //使用默认容量大小16以及加载因子0.75初始化HashMap,构造HashSet
    public HashSet() {
        map = new HashMap<>();
    }

    //初始化指定集合和默认加载因子0.75的map,构造HashSet
    public HashSet(Collection<? extends E> c) {
        map = new HashMap<>(Math.max((int) (c.size()/.75f) + 1, 16));
        addAll(c);
    }

    //使用指定容量大小和加载因子初始化map,构造HashSet
    public HashSet(int initialCapacity, float loadFactor) {
        map = new HashMap<>(initialCapacity, loadFactor);
    }

    //使用指定容量大小和默认加载因子0.75初始化map,构造HashSet
    public HashSet(int initialCapacity) {
        map = new HashMap<>(initialCapacity);
    }

    //包访问权限,构造空的LinkedHashSet
    HashSet(int initialCapacity, float loadFactor, boolean dummy) {
        map = new LinkedHashMap<>(initialCapacity, loadFactor);
复制代码

方法

  • size()方法:内部调用Map的size方法。
    public int size() {
        return map.size();
    }
复制代码
  • isEmpty()方法,也是调用map,里面是通过判断size是否为0来判断是否为null
 public boolean isEmpty() {
        return map.isEmpty();
    }
复制代码
  • add()方法 HashSet的add方法内部通过HashMap.put()方法来实现key的添加,在HashMap内部真正执行的是putVal()方法,putVal这边就不说了 HashMap讲过
    public boolean add(E e) {
        return map.put(e, PRESENT)==null;
    }
复制代码

总结

HashSet 还真没啥讲了 ,就是把HashMap的key 拿来当数据存,基本上都是调用的是HashMap的方法,所以说讲的也少,总结一下吧

  • HashSet的实现支持null的key,同时HashSet的内部不支持重复的key
  • 不重复
  • 线程不安全


目录
相关文章
|
监控 Kubernetes 负载均衡
spring boot应用优化,6s内启动,内存减半
taptap-developer是一个spring boot框架驱动的纯Grpc服务,所以,只用了四步,移除了web和spring cloud相关的模块后,启动速度就稳稳的保持在了6s内。除了启动速度提升外,在服务待机状态下,内存锐减了50%左右,从500M左右的内存占用,缩减到了250M不到。
10270 113
spring boot应用优化,6s内启动,内存减半
|
存储 缓存 监控
社交软件红包技术解密(四):微信红包系统是如何应对高并发的
本文将为读者介绍微信百亿级别红包背后的高并发设计实践,内容包括微信红包系统的技术难点、解决高并发问题通常使用的方案,以及微信红包系统的所采用高并发解决方案。
456 13
|
缓存 Java Spring
Spring中Bean创建过程之源码分析
Spring中Bean创建过程之源码分析
339 0
|
SQL 存储 JSON
MySQL 8.0新特性
MySQL 8.0新特性
1234 0
|
存储 监控 项目管理
项目沟通管理
项目沟通管理
222 0
项目沟通管理
|
缓存 Java
Java基础12-深入理解Java中回调机制(一)
Java基础12-深入理解Java中回调机制(一)
413 5
|
Java
Java动态获取某个接口下所有的实现类对象集合
Java动态获取某个接口下所有的实现类对象集合
750 1
|
Java 测试技术
Java基础12-深入理解Java中回调机制(二 )
Java基础12-深入理解Java中回调机制(二 )
169 1
|
Java 程序员 调度
Java基础18-一文搞懂Java多线程使用方式、实现原理以及常见面试题(一)
Java基础18-一文搞懂Java多线程使用方式、实现原理以及常见面试题(一)
283 0
Java基础18-一文搞懂Java多线程使用方式、实现原理以及常见面试题(一)
Python中的while循环
Python中的while循环