CRUD补全计划
首页
  • Java-集合框架

    • Java集合-概述
    • Java集合-源码解析
  • Java-并发相关

    • Java并发-概述
    • Java并发-线程池
    • Java并发-锁详解
  • Java-JVM相关

    • Java-类加载机制
    • Java-垃圾回收机制
  • SQL 数据库

    • MySQL详解
    • MySQL-索引
    • MySQL-事务
  • NoSQL 数据库

    • Redis-概述
    • Redis-Zset实现原理
    • Redis-AOF与RDB
  • Spring知识体系

    • Spring-IOC概述
    • Spring-IOC源码分析
    • Spring-AOP原理详解
  • ORM框架

    • Mybatis架构
    • Mybatis执行流程
    • Mybatis缓存原理
  • RPC框架

    • Dubbo详解
  • 限流框架

    • 限流框架详解
  • Web容器

    • Tomcat详解
  • 架构基础

    • 高并发-缓存
    • 高并发-限流
  • 场景实现

    • 场景概述
    • 订单过期关闭
    • 库存扣减
  • 概述

    • 机器学习概述
    • 网站roadmap
    • 关于我
    • 友链
首页
  • Java-集合框架

    • Java集合-概述
    • Java集合-源码解析
  • Java-并发相关

    • Java并发-概述
    • Java并发-线程池
    • Java并发-锁详解
  • Java-JVM相关

    • Java-类加载机制
    • Java-垃圾回收机制
  • SQL 数据库

    • MySQL详解
    • MySQL-索引
    • MySQL-事务
  • NoSQL 数据库

    • Redis-概述
    • Redis-Zset实现原理
    • Redis-AOF与RDB
  • Spring知识体系

    • Spring-IOC概述
    • Spring-IOC源码分析
    • Spring-AOP原理详解
  • ORM框架

    • Mybatis架构
    • Mybatis执行流程
    • Mybatis缓存原理
  • RPC框架

    • Dubbo详解
  • 限流框架

    • 限流框架详解
  • Web容器

    • Tomcat详解
  • 架构基础

    • 高并发-缓存
    • 高并发-限流
  • 场景实现

    • 场景概述
    • 订单过期关闭
    • 库存扣减
  • 概述

    • 机器学习概述
    • 网站roadmap
    • 关于我
    • 友链
  • Java-集合框架

    • Java集合-类关系图
    • 源码解析-ArrayList
    • 源码解析-LinkedList
    • 源码解析-Stack & Queue
    • 源码解析-PriorityQueue
    • 源码解析-HashMap
    • 源码解析-HashSet
      • 源码解析-LinkedHashMap
      • 源码解析-TreeMap & TreeSet
      • 源码解析-WeekHashMap
    • Java-并发相关

      • Java并发-概述
      • Java并发-理论基础
      • Java并发-线程池
      • Java并发-锁详解
    • Java-JVM相关

      • Java-类加载机制
      • Java-垃圾回收机制
    • Java
    • Java-集合框架
    zfd
    2024-03-11
    目录

    源码解析-HashSet

    # 概述

    HashSet的实现方式比较简单,底层是在HashMap的基础上包装了一层,根据HashMap的特性,HashSet主要有以下特点

    • 可以实现元素去重保证集合元素唯一
    • 允许null元素
    • 线程不安全,使用Collections.synchronizedSet(new HashSet(…))来实现线程安全
    • 迭代器实现是fail-fast的,在迭代的时候修改元素会抛出ConcurrentModificationException

    # 构造函数

    
    //底层用来存储的HashMap实例
    private transient HashMap<E,Object> map;
    //HashSet存放元素的时候是放在HashMap的key里的,需要一个没有任何意义的value
    private static final Object PRESENT = new Object();
    
    //直接初始化底层的map
    public HashSet() {
            map = new HashMap<>();
    }
    
    //传入指定集合,相当于初始化存入一些数据,调用HashMap实现
    //这里HashMap初始化的时候指定的容量大小 可以参考HashMap源码解析文章中的容量设置问题,可以看到官方也是这样使用的
    public HashSet(Collection<? extends E> c) {
          map = new HashMap<>(Math.max((int) (c.size()/.75f) + 1, 16));
          addAll(c);
    }
    
    //直接指定初始化大小
    public HashSet(int initialCapacity) {
        map = new HashMap<>(initialCapacity);
    }
    
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23

    # 方法解析

    # add()

    
    
    //调用HashMap直接put
    public boolean add(E e) {
        return map.put(e, PRESENT)==null;
    }
    
    
    
    1
    2
    3
    4
    5
    6
    7
    8

    # remove()

    //调用map的remove方法
    public boolean remove(Object o) {
        return map.remove(o)==PRESENT;
    }
    
    1
    2
    3
    4
    上次更新: 2024/11/06, 02:51:54

    ← 源码解析-HashMap 源码解析-LinkedHashMap→

    Theme by Vdoing | Copyright © 2013-2025 zfd 苏ICP备2023039568号
    • 跟随系统
    • 浅色模式
    • 深色模式
    • 阅读模式