首页 > 编程语言 >深入源码探讨HashSet

深入源码探讨HashSet

时间:2023-06-08 22:03:33浏览次数:34  
标签:HashMap hashSet HashSet 探讨 System 源码 public out



深入源码探讨HashSet_Java

我们在工作中时常会用到HashSet,面试也有时候容易被问到,下面咱们就来聊聊HashSet

使用案例

public class Test {
    public static void main(String[] args) {
        HashSet<String> hashSet = new HashSet<>();
        hashSet.add("Java");
        hashSet.add("R");
        hashSet.add("C");
        hashSet.add("C#");
        hashSet.add("C#");
        hashSet.add("Java");
        hashSet.add(null);
        System.out.println("hashSet的长度:" + hashSet.size());
        //第一种遍历方式
        System.out.println("第一种方式遍历");
        Iterator<String> iterator = hashSet.iterator();
        while (iterator.hasNext()) {
            System.out.print(iterator.next());
            System.out.print(" ");
        }
        System.out.println("");
        System.out.println("第二种方式遍历");
        for (String string : hashSet) {
            System.out.print(string);
            System.out.print(" ");
        }
    }
}

输出

hashSet的长度:5
第一种方式遍历
C# null Java R C
第二种方式遍历
C# null Java R C

从上面的例子可以得知几个结果:

1,不能放入重复的。

2,不是按照放入的顺序存放的。

3,null也可以存放。

关键源码

HashSet的类图

深入源码探讨HashSet_java_02

我们来看看HashSet到底是怎么玩的

深入源码探讨HashSet_Java_03

JDK1.2开始有的HashSet,实现了解耦Set,CloneableSerializable

  1. Set是个接口,定义了很多方法。
  2. Cloneable可以对象克隆。
  3. Serializable可以序列化与反序列。
  4. 继承了抽象类AbstractSet

AbstractSet也是Set接口的实现类,主要有以下几个方法:

深入源码探讨HashSet_System_04

AbstractSet实现了三个方法equalshashCoderemoveAll。然后所有继承AbstractSet的子类都不用自己去实现此三个方法。

Set定义了如下方法:

深入源码探讨HashSet_System_05

HashSet中关键的变量和方法:

//定义了一个HashMap类型的变量
private transient HashMap<E,Object> map;
// Dummy value to associate with an Object in the backing Map
//与备份Map中的对象关联的虚拟值
private static final Object PRESENT = new Object();
public HashSet() {
    map = new HashMap<>();
}
//设置HashSet的容量其实就是设置HashMap的容量
public HashSet(int initialCapacity) {
    map = new HashMap<>(initialCapacity);
}
//求HashSet的大小就是求HashMap
public int size() {
   return map.size();
}
//往HashSet存放数据其实就是往HashMap存放数据
//数据作为key,然后value就是固定Object对象PRESENT
public boolean add(E e) {
   return map.put(e, PRESENT)==null;
}
public Iterator<E> iterator() {
   return map.keySet().iterator();
}
public int size() {
   return map.size();
}
....
//序列化与反序列化
private void writeObject(java.io.ObjectOutputStream s){
    //...
}
private void readObject(java.io.ObjectInputStream s){
    //...
}

可以看出,HashSet的操作都是基于HashMap的操作。

总结

HashSet的所有操作都是基于HashMap进行操作,用存放进HashSet的数据作为HashMap的key在使用一个固定Object对象作为HashMap的value。

在这金三银四的季节,栈长为大家准备了四份面试宝典:


《java面试宝典5.0》


《Java(BAT)面试必备》


《350道Java面试题:整理自100+公司》


《资深java面试宝典-视频版》


大量电子书籍


分别适用于初中级,中高级,以及资深级工程师的面试复习。


内容包含java基础、javaweb、各个性能优化、JVM、锁、高并发、反射、Spring原理、微服务、Zookeeper、数据库、数据结构、限流熔断降级等等。


标签:HashMap,hashSet,HashSet,探讨,System,源码,public,out
From: https://blog.51cto.com/u_11702014/6443562

相关文章

  • 深入探讨源码-HashMap
    又聊到HashMap了,其实网上已经有很多关乎HashMap的文章了,本文将对HashMap的实现方式和一些关键点进行一一的说明,仅限个人理解,如有疑惑和问题,请联系作者更正。说明:JDK版本1.8.0_151HashMapHash表是一个数组+链表的结构,这种结构能够保证在遍历与增删的过程中,如果不产生hash碰撞,仅需一......
  • 源码安装redis-migrate-tool(redis迁移工具)部署安装
    源码安装redis-migrate-toolredis-migrate-toolunzipredis-migrate-tool-master.zipcdredis-migrate-tool-masteryum-yinstallautomakelibtoolautoconfbzip2autoreconf-fvi./configuremake./src/redis-migrate-toolrmt.conf配置项修改[source]typ......
  • BitSet的源码研究
    这几天看BloomFilter,因为在java中,并不能像C/C++一样直接操纵bit级别的数据,所以只能另想办法替代:1)使用整数数组来替代;2)使用BitSet;BitSet实际是由“二进制位”构成的一个Vector。如果希望高效率地保存大量“开-关”信息,就应使用BitSet。它只有从尺寸的角度看才有意义;如果希望的高效率......
  • JAVA的springboot+vue学习平台管理系统,校园在线学习管理系统,附源码+数据库+论文+PPT
    1、项目介绍在Internet高速发展的今天,我们生活的各个领域都涉及到计算机的应用,其中包括学习平台的网络应用,在外国学习平台已经是很普遍的方式,不过国内的管理平台可能还处于起步阶段。学习平台具有学习信息管理功能的选择。学习平台采用java技术,基于springboot框架,mysql数据库进行......
  • Java语言实现生产者与消费者的消息队列模型(附源码)
    Java构建生产者与消费者之间的生产关系模型,可以理解生产者生产message,存放缓存的容器,同时消费者进行消费需求的消耗,如果做一个合理的比喻的话:生产者消费者问题是线程模型中的经典问题。解决生产者/消费者问题有两种方法:一是采用某种机制保护生产者和消费者之间的同步;二是在生产者和......
  • OSWorkflow观念探讨
     OSWorkflow观念探讨-转自史蒂芬--流程设定基础(史帝芬,2005/6/6,) 看完第一支程式,相信读者会有许多疑问,这里先就流程的设定做初步的介绍。首先,读者应该注意到了,第一支程式的用到三个xml设定档,这三个是设定流程的设定档,说明如下。osworkflow.xml:这个档案是设定流程......
  • 多校园微社区交友及二手物品论坛小程序源码运营需要什么?
    在大学校园里,存在着很多的二手商品,但是由于信息资源的不流通以及传统二手商品信息交流方式的笨拙,导致了很多仍然具有一定价值或者具有非常价值的二手商品的囤积,乃至被当作废弃物处理。现在通过微信小程序的校园二手交易平台,可以方便快捷的发布和交流任何二手商品的信息,并且可以通过......
  • zabbix--CentOS7 源码安装Zabbix6 LTS版本
    环境说明#这里使用为 CentOS7.6 版本进行测试验证,ZabbixServer 采用源码包部署,数据库采用 MySQL8.0 版本,zabbix-web 使用 nginx+php 来实现。具体信息如下:软件名版本安装方式ZabbixServer6.0.3源码安装ZabbixAgent6.0.3源码安装MySQL8.0.28yum安......
  • 跟着源码学IM(十一):一套基于Netty的分布式高可用IM详细设计与实现(有源码)
    本文由will分享,个人博客zhangyaoo.github.io,原题“基于Netty的IM系统设计与实现”,有修订和重新排版。1、引言本文将要分享的是如何从零实现一套基于Netty框架的分布式高可用IM系统,它将支持长连接网关管理、单聊、群聊、聊天记录查询、离线消息存储、消息推送、心跳、分布式唯......
  • 直播小程序源码,自定义支持360度旋转的View
    直播小程序源码,自定义支持360度旋转的View自定义Touch360ImageView的代码如下: packagecom.example.myapplication;importandroid.content.Context;importandroid.content.res.TypedArray;importandroid.graphics.drawable.LevelListDrawable;importandroid.util.Attribut......