专栏首页吉林乌拉HashSet源码解析

HashSet源码解析

今天我们分析一下HashSet的底层实现,因为HashSet底层是通过HashMap实现的。 所以HashSet底层也是通过哈希表的数据结构存储的。所以这里我们就不在介绍有关数据结构方面的知识了,有不了解哈希表底层实现的可以去浏览HashMap这篇文章。下面我们将和其它集合一样,从HashSet的初始化方面着手,来分析一下HashSet的底层实现。

  • 初始化

我们看到,在HashSet中的无参构造方法中,直接创建了一个HashMap对象。这就证明了我们上述所说的,HashSet底层是通过HashMap实现的。我们在分析HashMap那篇文章中有提到过。如果我们使用无参的构造方法来创建HashMap对象,那么此时底层的数据结构不会初始化,第一次初始化发生在第一次调用put方法的时候。所以我们在这里可以说,当我们调用无参构造方法来创建HashSet对象时,底层的数据结构也不会执行初始化。那么它第一次初始化的动作,也应该发生在第一次调用添加元素的方法中,也就是HashSet中的add方法。下面我们看一下该方法的具体的逻辑。

上面代码是HashSet中add方法,我们看到该方法的逻辑是直接调用了HashMap中的put方法,并将添加的元素的值设置为HashMap中的key,value存储一个Object对象。

  • 总结

分析到这里使我们知道HashSet有以下几点特性,它们分别是:

  • 在HashSet中是不能保证元素的添加顺序与遍历顺序是一致的。因为底层是通过HashMap中的key的值保存的。因为HashMap中的key的值是通过key的hash code计算出来的。所以不能保证添加顺序与遍历顺序是一致的。
  • 因为HashSet底层是通过HashMap中的key的值保存的,所以在HashSet中是不能保存重复元素的。因为在HashMap中的key也是不能重复的。如果在HashMap中保存了重复的key,那么后添加到HashMap中的value会替换掉先添加到HashMap中的value。
  • 因为HashMap不是线程安全的集合类,并且我们分析HashSet源码时,也没有发现HashSet添加额外的同步关键字synchronized,所以说明HashSet也不是线程安全的集合类。

本文分享自微信公众号 - 吉林乌拉(jilinwulacom),作者:吉林乌拉

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-07-17

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 自动创建代理-BeanNameAutoProxyCreator

    在其它的文章中我们基本都是采用ProxyFactoryBean类来创建代理类的,但在使用此类时,我们通常要设置很多属性不方便我们使用。在spring中我们还可以...

    吉林乌拉
  • ReentrantLock类与Condition类的结合使用

    我们在上一篇简单介绍了ReentrantLock类的基本使用,也就是获取锁,与释放锁。那如果我们要实现wait()和notify()等待通知的功能在Reentr...

    吉林乌拉
  • Java中类加载器

    在上一篇类加载中我们介绍了一个类要加载到内存中要分为7个步骤。其中第一步就是加载也就是通过类的全限定名来获取类的二进制字节流。在Java中把上述加载的过程定义了...

    吉林乌拉
  • 探索JAVA并发 - 可重入锁和不可重入锁

    第二次调用lock后线程就阻塞了,线程开始等待持有锁的线程放手,然而是它是它就是它。

    acupt
  • 面试必会:HashMap 实现原理解读

    HashMap是Java开发当中使用得非常多的一种数据结构,因为其可以快速的定位到需要查找到数据,其最快的速度可以达到O(1),最差的时候也可以达到O(n)。本...

    好好学java
  • 性能测试案例:redis获取不到连接池,Timeout waiting for idle object

    这是几个月前压测某项目登录接口时遇到的性能问题,虽然大家不一定会遇到,但是分析定位问题的思路还是可以参考一下。

    cctester
  • [PHP] 排序和查找算法

    冒泡排序的原理可以顾名思义:把每个数据看成一个气泡,按初始顺序自底向上依次对两两气泡进行比较,对上重下轻的气泡交换顺序(这里用气泡轻、重表示数据大、小),保证轻...

    陶士涵
  • JavaScript 数据结构与算法之美 - 十大经典排序算法汇总

    笔者写的 JavaScript 数据结构与算法之美 系列用的语言是 JavaScript ,旨在入门数据结构与算法和方便以后复习。

    夜尽天明
  • java面试热点:集合框架(二)

    神秘的寇先森
  • 曾响铃:重场景体验下的家居业,考验的究竟是啥?

    近年互联网+概念大行其道,各类“互联网+传统行业”备受关注,有的乘借风口顺势起飞,有的制造风口,帮助其他人起飞,“互联网+家居”也迎来前所未有的发展契机。传统家...

    曾响铃

扫码关注云+社区

领取腾讯云代金券