• 集合框架----源码解读HashSet篇


    1.官方介绍

    该类实现了Set接口,由一个哈希表(实际上是一个Hash Map实例)作为后台。它不保证集合的迭代顺序;特别地,它并不能保证秩序会随着时间的推移而保持不变。该类允许空元素。
    该类为基本操作(添加、删除、包含和大小)提供了恒定的时间性能,假设哈希函数在桶之间适当分散元素。迭代这个集合需要的时间正比于Hash Set实例的大小(元素的个数)加上支持Hash Map实例(桶的数量)的"容量"之和。因此,如果迭代性能很重要,不要将初始容量设置得太高(或负荷系数过低)是非常重要的。

    注意,这种实现并不同步。如果多个线程并发访问一个哈希集,并且至少有一个线程修改该哈希集,则必须对外同步。这通常是通过对一些自然封装集合的对象进行同步来完成的。如果不存在这样的对象,则应该使用Collections . synchronoused Set方法对集合进行"包装"。这最好在创建时完成,以防止意外的不同步访问集合:

    Set s = Collections.synchronizedSet(new HashSet(...));

    该类迭代器方法返回的迭代器是快速失败的:如果在迭代器创建后的任意时刻修改了集合,除了通过迭代器自身的移除方法之外,迭代器以任何方式抛出了Concurrent ModificationException。因此,在面对并发修改时,迭代器能够快速、干净地失效,而不是冒着在未来不确定时刻发生任意、非确定性行为的风险。
    需要注意的是,迭代器的快速失效行为是无法保证的,因为一般来说,在存在不同步的并发修改的情况下,无法做出任何硬性保证。快速迭代器在尽力而为的基础上抛出Concurrent ModificationException。因此,编写一个依赖于此异常的程序来保证其正确性是错误的:迭代器的失效快行为应该只用于检测bug。
    该类是Java集合框架的成员。

    2.底层实现原理

    进入HashSet 他的构造器就是new一个HashMap

    3. HashSet的add方法

    HashSet的add方法底层就是HashMap的put方法来添加元素,存放的值就HashMap的key,因为我们的HashMap的key不允许重复,HashSet也是不允许存放重复元素。

     4.手写HashSet

    1. package com.example.list.list;
    2. import java.util.HashMap;
    3. //手写HashSet
    4. public class HashSet {
    5. private HashMap map;
    6. private static final Object PRESENT = new Object();
    7. public HashSet() {
    8. map = new HashMap<>();
    9. }
    10. public boolean add(E e) {
    11. return map.put(e, PRESENT) == null;
    12. }
    13. @Override
    14. public String toString() {
    15. return "HashSet{" +
    16. "map=" + map +
    17. '}';
    18. }
    19. }

     5.HashSet没有Get方法

    HashSet没有Get方法,就是因为他底层是基于HashMap实现的,是散列的,无法通过index来准确的获取元素,要想获取存放的元素可以用迭代器或者加强for循环

     6.总结

    HashSet基于HashMap来实现,不重复元素的集合

    允许null值

    是无序的,不会记录插入的顺序 

    没有Get方法,所以不能使用普通的for循环遍历

  • 相关阅读:
    基于AlgoT1设备实践多源融合定位算法(GNSS+INS+VISION)
    大理环洱海自动驾驶项目一期投入2.89亿元,拟购73台自动驾驶车
    重绘、重排区别如何避免
    设计一个程序统计某班全体学生3门课的考试成绩。要求先输入学生人数,并输入每个学生的三门成绩,统计出每门课程的全班平均分及每个考生所有考试的总分。(二维数组)
    C#NET6基于MailKit 进行邮件发送通知
    ftp登录时,报错“530 Login incorrect.Login failed”
    「软考」高项通关秘籍,附赠备考资料
    非类型模板参数+模板的特化
    二叉搜索树的Java递归实现
    STM32F1与STM32CubeIDE编程实例-红外寻迹传感器驱动
  • 原文地址:https://blog.csdn.net/qq_42847719/article/details/128092354