Java的HashSet源码详解

 更新时间:2023年09月05日 10:36:34   作者:Fly_Fly_Zhang  
这篇文章主要介绍了Java的HashSet源码详解,HashSet底层封装的是HashMap,所以元素添加会放到HashMap的key中,value值使用new Object对象作为value,所以HashSet和HashMap的所具有的特点是类似的,需要的朋友可以参考下

HashSet

特点:

底层数据结构:HashSet底层封装的是HashMap,所以元素添加会放到HashMap的key中,value值使用new Object对象作为value;

所以HashSet和HashMap的所具有的特点是类似的;

  •  数据不能重复;
  •  可以存储null值;
  •  数据不能保证插入有序;

默认值:与HashMap相同;

基本属性

   private transient HashMap<E,Object> map;//HashMap集合
    private static final Object PRESENT = new Object();//调用HashMap方法,装入的value值

继承关系:

   public class HashSet<E>
    extends AbstractSet<E>//继承了AbstractSet
    implements Set<E>,//实现set方法
     Cloneable,//标记本类可以被克隆
      java.io.Serializable//可以被序列化

构造函数:均调了HashMap对应的构造函数

     public HashSet() {
        map = new HashMap<>();
    }
    public HashSet(Collection<? extends E> c) {
        map = new HashMap<>(Math.max((int) (c.size()/.75f) + 1, 16));
        addAll(c);
    }
    public HashSet(int initialCapacity, float loadFactor) {
        map = new HashMap<>(initialCapacity, loadFactor);
    }
    public HashSet(int initialCapacity) {
        map = new HashMap<>(initialCapacity);
    }
    HashSet(int initialCapacity, float loadFactor, boolean dummy) {
        map = new LinkedHashMap<>(initialCapacity, loadFactor);
    }

CRUD(增删改查)

add()

   public boolean add(E e) {//只能添加一个null值
        return map.put(e, PRESENT)==null; 
		//HashMap的put方法,如果是新添加的结点,会返回null;
		//如果是原有结点,那么会返回value值,这样返回的就是false这样表明集合中已经有该元素;
    }

remove();

    public boolean remove(Object o) {
        return map.remove(o)==PRESENT;
		//HashSet添加进HashMap中所有value值都是PRESENT,
		//如果找到key值,那么返回的value值肯定是PRESENT;
		//没有找到,返回的是null;
    }

HashSet应用场景

去重 打印全部数据,重复性元素只打印一次;

        ArrayList<Integer> arrayList=new ArrayList<>(100000);
        for (int i = 0; i <100000 ; i++) {
            arrayList.add((int) (Math.random()*1000));
        }
        iterator=arrayList.iterator();
        HashSet<Integer> hashSet1=new HashSet<>();
        while(iterator.hasNext()){
            Integer val= iterator.next();
            if(hashSet1.add(val)){//第一次添加才会返回true
                System.out.println(val);
            }
        }    

到此这篇关于Java的HashSet源码详解的文章就介绍到这了,更多相关Java的HashSet内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • JDBC获取数据库连接的5种方式实例

    JDBC获取数据库连接的5种方式实例

    JDBC是一种用于执行SQL语句的JavaAPI,为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成,提供了诸如查询和更新数据库中数据的方法,这篇文章主要给大家介绍了关于JDBC获取数据库连接的5种方式,需要的朋友可以参考下
    2022-06-06
  • Java递归来实现汉诺塔游戏,注释详细

    Java递归来实现汉诺塔游戏,注释详细

    这篇文章介绍了Java递归来实现汉诺塔游戏的方法,文中的代码注释介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-11-11
  • Mybatis ResultMap映射、多表查询与缓存机制详解

    Mybatis ResultMap映射、多表查询与缓存机制详解

    本文详细介绍了MyBatis中ResultMap的使用、多表查询(包括一对一和一对多关系)以及分步查询和分页查询,此外,还探讨了MyBatis的缓存机制,包括一级缓存和二级缓存,通过这些内容,读者可以全面掌握如何在MyBatis中进行复杂的数据查询和缓存管理,感兴趣的朋友一起看看吧
    2025-10-10
  • Spring Boot如何使用JDBC获取相关的数据详解

    Spring Boot如何使用JDBC获取相关的数据详解

    这篇文章主要给大家介绍了关于Spring Boot如何使用JDBC获取相关数据的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-03-03
  • IDEA使用Git对分支进行开发合并的全过程

    IDEA使用Git对分支进行开发合并的全过程

    本文介绍了在IDEA中使用Git进行分支开发和合并的具体操作步骤,并分享了全局用户名和邮箱的配置命令,帮助开发者规范高效地管理项目分支,需要的朋友可以参考下
    2025-10-10
  • Spring框架生成图片验证码实例

    Spring框架生成图片验证码实例

    验证码在很多地方都会遇到,实现的方法和形式也有很多,主要的目的就是为了安全,防止一些恶意的攻击等。今天在之前搭建好的一个spring框架上写了一个验证码的生成demo,我会贴出细节代码,但是spring的配置就不在介绍了,有需要的可以参考借鉴。
    2016-08-08
  • 如何将文件流转换成byte[]数组

    如何将文件流转换成byte[]数组

    这篇文章主要介绍了如何将文件流转换成byte[]数组,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-12-12
  • 解决axios发送post请求,springMVC接收不到数据问题的处理

    解决axios发送post请求,springMVC接收不到数据问题的处理

    文章主要讨论了Vue组件无法正确接收和处理Axios请求的问题,并详细描述了SpringMVC中使用@PathVariable、@RequestBody、@RequestParam的不同场景及其对应的前端Axios写法
    2026-05-05
  • 详解Spring boot GraalVM 原生镜像支持

    详解Spring boot GraalVM 原生镜像支持

    GraalVM Native Image 是 GraalVM 提供的 ahead-of-time (AOT) 编译工具,可以将 Java 应用编译为本地可执行文件,跳过 JVM 启动和 JIT 编译阶段,达到“秒级启动”和低内存占用的效果,本文介绍Spring boot GraalVM 原生镜像支持详解,感兴趣的朋友一起看看吧
    2025-12-12
  • Java使用新浪微博API通过账号密码方式登陆微博的实例

    Java使用新浪微博API通过账号密码方式登陆微博的实例

    这篇文章主要介绍了Java使用新浪微博API通过账号密码方式登陆微博的实例,一般来说第三方App都是采用OAuth授权认证然后跳转之类的方法,而本文所介绍的账号方式则更具有自由度,需要的朋友可以参考下
    2016-02-02

最新评论