HashSet 如何体现出无序性?

简介: HashSet 如何体现出无序性?

文章目录


一、创建hashset实例化对象

二、查看源码

三、查看HashMap的put添加数据方式

四、总结分析


为什么sh说HashSet是无序的?首先我们看源码解析。


一、创建hashset实例化对象


Set<String> set = new HashSet<String>();
set.add("hello");
set.add("hello");//重复元素
set.add("java");
set.add("world");
System.out.println(set);//[java, world, hello]


二、查看源码


1、源码类头构造

public class HashSet<E>
    extends AbstractSet<E>
    implements Set<E>, Cloneable, java.io.Serializable


2、HashSet集合的主要成员变量

private transient HashMap<E,Object> map;
    // Dummy value to associate with an Object in the backing Map
    private static final Object PRESENT = new Object();
    /**
     * Constructs a new, empty set; the backing <tt>HashMap</tt> instance has
     * default initial capacity (16) and load factor (0.75).
     */
    public HashSet() {
        map = new HashMap<>();
    }


3、HashSet集合添加数据

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


三、查看HashMap的put添加数据方式


public V put(K key, V value) {
        return putVal(hash(key), key, value, false, true);
    }


四、总结分析


通过之前分析的hashmap数据增加的源码,可以发现:


1、HashSet集合操作,是将数据值存入至HashMap的key中;


2、HashMap在保存数据时,顺序是通过计算key的hash值和当前数组长度的 & 运算,计算保存数据的下标位置。所以说set是无序的。


3、由于每次保存数据,存入的是一个共同的值:

private static final Object PRESENT = new Object();


当存在key的hash与数组大小 & 计算到的值存在数组中时,则会进行新的值的覆盖,所以说set是不重复的。

目录
相关文章
|
JSON Dubbo 测试技术
junit5单元测试自动生成最佳实践
在对比了几款插件后,最终选择了重新打造一套适合自己的插件。参看:【谈一谈单元测试】插件安装本地安装[文件: jcode5-1.0-SNAPSHOT.zip] 请在PC端预览或下载idea插件市场下载,搜索JCode5            插件使用插件有三个功能生成测试代码,也就是生成单元测试。生成json数据,通常用来生成测试数据,比如model。用来参数化测试。增加测试方法,随着业务开发,类可
2861 0
junit5单元测试自动生成最佳实践
|
前端开发 JavaScript 监控
layui框架IE8下的兼容问题收录一
layui框架IE8下的兼容问题收录一
2112 0
|
1月前
|
弹性计算 人工智能 固态存储
阿里云服务器多少钱一年?整理2026年阿里云服务器新购、续费与升级配置价格费用明细
阿里云服务器主要分为轻量应用服务器、云服务器 ECS 和 GPU 服务器三类,不同类型适配不同使用场景,费用因配置、租期及计费方式存在差异。以下从新购价格、续费优惠、升级规则及额外收费项等方面,详细说明阿里云服务器的费用情况。
|
6月前
|
机器学习/深度学习 Ubuntu 物联网
ubuntu和linux 什么关系?
综上所述,Ubuntu与Linux之间存在着紧密的关系。Ubuntu是基于Linux内核的操作系统发行版之一,它继承了Linux的开源精神,并在此基础上进行了定制和优化,以更好地适应桌面和服务器应用。同时,Ubuntu也受益于Linux社区的支持和贡献,为用户提供了丰富的软件和工具选择。对于想要了解和使用开源操作系统的用户来说,Ubuntu无疑是一个值得推荐的选择。
|
7月前
|
安全 Java 测试技术
Java 项目实战中现代技术栈下代码实现与测试调试的完整流程
本文介绍基于Java 17和Spring技术栈的现代化项目开发实践。项目采用Gradle构建工具,实现模块化DDD分层架构,结合Spring WebFlux开发响应式API,并应用Record、Sealed Class等新特性。测试策略涵盖JUnit单元测试和Testcontainers集成测试,通过JFR和OpenTelemetry实现性能监控。部署阶段采用Docker容器化和Kubernetes编排,同时展示异步处理和反应式编程的性能优化。整套方案体现了现代Java开发的最佳实践,包括代码实现、测试调试
255 0
|
机器学习/深度学习 算法 决策智能
北大领衔,多智能体强化学习研究登上Nature子刊
北京大学研究团队近日在《Nature》子刊上发布了一篇关于多智能体强化学习(MARL)的论文,提出了一种高效且可扩展的MARL框架,旨在解决大规模网络控制系统中的决策问题。该框架实现了智能体间的局部通信,减少了通信成本与计算复杂度,并在交通、电力及疫情防控等多个真实场景实验中,显著提升了决策性能。论文链接:https://www.nature.com/articles/s42256-024-00879-7。尽管该研究仍存局限,但为MARL的应用提供了新思路。
479 2
|
关系型数据库 MySQL 数据库
Flask使用SQLAlchemy添加悲观锁和乐观锁
什么是悲观锁和乐观锁? • 悲观锁:假设在访问数据时会发生冲突,因此在访问数据前,先锁住数据。在锁被释放之前,其他事务无法访问此数据。是属于数据库中的一种互斥锁机制 • 乐观锁:假设在访问数据时冲突较少,因此不会锁住数据,而是在提交更新时检查是否有冲突。如果检测到冲突,则放弃更新。但是乐观锁并非真正的数据库锁。
|
Web App开发 Cloud Native 测试技术
云原生之使用Docker部署Firefox浏览器
【7月更文挑战第21天】云原生之使用Docker部署Firefox浏览器
1014 3
|
机器学习/深度学习 编解码 算法
【YOLOv8改进】Polarized Self-Attention: 极化自注意力 (论文笔记+引入代码)
该专栏专注于YOLO目标检测算法的创新改进和实战应用,包括卷积、主干网络、注意力机制和检测头的改进。作者提出了一种名为极化自注意(PSA)块,结合极化过滤和增强功能,提高像素级回归任务的性能,如关键点估计和分割。PSA通过保持高分辨率和利用通道及空间注意力,减少了信息损失并适应非线性输出分布。实验证明,PSA能提升标准基线和最新技术1-4个百分点。代码示例展示了如何在YOLOv8中实现PSA模块。更多详细信息和配置可在提供的链接中找到。
|
Web App开发 监控 数据可视化
【JVM实践入门篇】: VisualVM的插件下载
【JVM实践入门篇】: VisualVM的插件下载
1049 0
【JVM实践入门篇】: VisualVM的插件下载