首页 > 编程语言 >JDK源码分析-HashSet

JDK源码分析-HashSet

时间:2024-04-28 15:36:29浏览次数:24  
标签:HashMap JDK HashSet 元素 remove 源码 public PRESENT

概述

HashSet是Java集合框架中非常重要的一个类,它实现了Set接口,不允许出现重复元素,并且元素是无序的。HashSet的底层实现主要依赖于HashMap,通过HashMap来存储元素。如果想要了解HashMap,可以查看后续文章。

类图

从以上类图可以看到,HashSet实现了三个接口,继承了一个抽象类:

  • Serializable接口,表示Vector支持序列化功能
  • Cloneable接口,表示Vector支持克隆
  • Set接口,主要提供了添加、删除、遍历等功能
  • AbstractSet抽象类,主要提供元素对比、删除等操作

源码解读

成员变量

// 底层依赖HashMap,用于存储数据
private transient HashMap<E,Object> map;  
// PRESENT是一个静态常量对象,用于作为HashMap的value
// 因为HashSet只关心key(即HashSet中的元素),不关心value,所以这里使用了一个统一的占位符对象
// Dummy value to associate with an Object in the HashMap
private static final Object PRESENT = new Object();

构造方法

HashSet 中提供了四种构造方案:

  • public HashSet()默认构造函数
  • public HashSet(Collection<? extends E> c)创建一个包含集合c中所有元素的hashSet集合
  • public HashSet(int initialCapacity)创建一个自定义的初始容量和默认的负载因子0.75的hashSet集合
  • public HashSet(int initialCapacity, float loadFactor)创建一个自定义的初始容量和负载因子的hashSet集合

添加元素

HashSet的添加元素操作是通过调用HashMap的put方法实现的。由于HashSet只关心key,所以value统一使用PRESENT

public boolean add(E e) {
    return map.put(e, PRESENT)==null;
}

这里需要注意的是,HashMap的put方法会返回旧值,如果key不存在则返回null。因此,当HashSet添加一个新元素时,如果put方法返回null,说明元素添加成功;如果返回非null值,说明元素已经存在,添加失败。 

删除元素

HashSet的删除元素操作是通过调用HashMap的remove方法实现的。

public boolean remove(Object o) {
    return map.remove(o)==PRESENT;
}

同样地,HashMap的remove方法会返回被删除元素的旧值。如果HashSet成功删除了一个元素,那么remove方法应该返回PRESENT;否则返回null。

其他操作

HashSet还提供了其他操作,如判断元素是否存在(contains方法)、获取元素数量(size方法)、清空集合(clear方法)等,这些操作都是直接调用底层HashMap的相应方法实现的。

总结

HashSet的底层实现主要依赖于HashMap。HashSet通过HashMap来存储元素,并利用HashMap的特性实现了不重复和无序的要求。

 

标签:HashMap,JDK,HashSet,元素,remove,源码,public,PRESENT
From: https://www.cnblogs.com/grassLittle/p/18160672

相关文章

  • RocketMQ生产者启动源码
    核心代码初始化Default生产者DefaultMQProducerproducer=newDefaultMQProducer(PRODUCER_GROUP);设置NameAddr地址producer.setNamesrvAddr(DEFAULT_NAMESRVADDR);producer.start();分析newDefaultMQProducer(PRODUCER_GROUP)publicDefaultMQProducer(finalStringp......
  • Linux安装jdk的详细步骤
    jdkhttps://blog.csdn.net/qq_41694906/article/details/126372085通过Xftp把jdk安装包上传到linux服务器解压jdk命令tar-zxvfjdk-8u341-linux-x64.tar.gz配置环境变量vim/etc/profileexportJAVA_HOME=/opt/jdk1.8.0_341   (的地址需要修改)exportPATH=$JAVA_HOM......
  • jdk17对比jdk8
    Lambda表达式/***Lambda表达式*/privatestaticvoidlambda(){//JDK8List<Integer>list=Arrays.asList(1,2,3,4,5);list.forEach(n->System.out.println(n));//JDK17List<Integer&g......
  • DRF源码汇总
    DRF源码汇总【一】三大认证【1】认证【2】权限【3】频率【3.1】SimpleRateThrottle源码分析【二】JWT【1】simple-jwt【1.1】登录【1.2】认证......
  • ubuntu18源码安装postgresql15.2数据库
    由于官方的源只能安装到pg10这个版本,整了好一会没有成功就改为源码安装了。下载源代码源码并解压wgethttps://ftp.postgresql.org/pub/source/v15.2/postgresql-15.2.tar.gztar-xfpostgresql-15.2.tar.gzcdpostgresql-15.2/安装C++相关开发库和编译工具aptinst......
  • JDK源码分析-Vector
    概述Vector是Java集合中线程安全的动态数组,它也可以根据需要进行扩容和缩容,与ArrayList类似。但有一个重要的区别,Vector是同步的,也就是它的操作是线程安全的,在某些特定场景下是可以保证线程安全的,但同时也会带来性能损耗,因此在单线程环境通常还是推荐使用ArrayList。类图......
  • Nginx 源码安装
     Nginx官网:https://nginx.org参考:Nginx配置常用参数梳理https://www.jb51.net/server/285538k8k.htmnginx配置参数详解https://blog.csdn.net/u013286192/article/details/136418472Nginx配置详解https://www.runoob.com/w3cnote/nginx-setup-intro.html查看nginx开启......
  • JDK升级专题
    一、JVM17与JVM8的变化模块化系统(ProjectJigsaw)新的垃圾收集器  JDK17引入了ZGC和Shenandoah,这两个垃圾回收器在低延迟和高吞吐量方面表现优秀,同时提高了内存管理效率。 二、SpringBoot与SpringCloud版本对应关系及SpringBoot与JDK对应关系。   参考资料......
  • springBoot源码(一)
    构造函数运行代码publicConfigurableApplicationContextrun(String...args){ Startupstartup=Startup.create(); if(this.registerShutdownHook){ SpringApplication.shutdownHook.enableShutdownHookAddition(); } DefaultBootstrapContextbootstrapConte......
  • JDK源码分析-LinkedList
    概述相较于ArrayList,LinkedList在平时使用少一些。LinkedList内部是一个双向链表,并且实现了List接口和Deque接口,因此它也具有List的操作以及双端队列和栈的性质。双向链表的结构如下:它除了作为List使用,还可以作为队列或者栈来使用。publicclassLinkedList<E>......