Java 遍历 HashSet 为什么输出是有序的

javaSE (二十四)关于java集合的一些的问题:为什么集合能够直接打印、HashSet到底是有序还是无序的、HashSet如何保证存储唯一? 1、为什么集合能够直接打印? System.out.println(HashSet has); 答:因为集合的底层重写了toString方法,调用了StringBuilder类的.append()/.toString()方法将元素拼接起来 (特么这个 Iterator it = iterator();什么意思???没有对象供他引用啊用这个迭代器是干嘛的??) public String t... 阅读详情

1.问题

今天学习数据结构哈希表,知道了哈希表的牺牲了顺序性,从而保证了效率。然后我想到了java中的 hashset和Treeset,我记得以前学习set的时候,老师说set元素是有序的,有就是说,hashset 和 treeset都是有序的。可是现在在学习数据结构的时候发现hashset 是无序的, treeset 是有序的,那这就和前面所说的set是有序的互相矛盾了,所以让来验证一下,如下:

 

使用的是 java 8 

HashSet<Integer> set = new HashSet<>();
set.add(3);
set.add(1);
set.add(2);
System.out.println("HashSet : " + set);

TreeSet<Integer> treeSet = new TreeSet<>();
treeSet.add(3);
treeSet.add(1);
treeSet.add(2);
System.out.println("TreeSet : " + treeSet);
HashSet : [1, 2, 3]
TreeSet : [1, 2, 3]

从结果得知,hashset和 treeset都是有序的输出元素了。

这样的结果其实和我前面所讲的哈希表牺牲了有序这一命题所矛盾了,可是哈希表确实是牺牲了有序性,那么问题在哪里呢?

 

2.hashset实现原理

仔细回想,不难发现hashset底层使用hashmap来实现的,set的元素存放在map的key上面。

对于hashmap来讲,它的主体是一个Entry数组,Entry又是一个链表,因此hashmap的存储过程如下:

1.计算key的hash值

2.把得到的hash值作为数据下标去存储到Entry数组。在这里可能出现不一样的key的得到的hash值相等,如果相等,就把新的value存到当前下标下保存的Entry里面(Entry是链表)

由此可见,hashset实际上存储元素的时候进行了获取hash的操作,而对于测试用例中的 3,2,1来说,他们的hash值就是自身,所以根据这个hash值得到数组的下标存储元素后,表现出来就是有序的

 

3.treeset实现原理

treeset的底层使用treemap实现的,set的元素存放在map的key上面,

treemap又是用红黑树进行实现,实际上红黑树是一种自平衡二叉查找树,它满足元素的有序性,因此treeset的元素是具有有序性的。

 

4.结论

针对以上分析,在写一次测试代码

HashSet<Integer> set = new HashSet<>();
set.add(3);
set.add(1);
set.add(2);
System.out.println("HashSet : " + set);

TreeSet<Integer> treeSet = new TreeSet<>((m, n) -> n - m);
treeSet.add(3);
treeSet.add(1);
treeSet.add(2);
System.out.println("TreeSet : " + treeSet);
HashSet : [1, 2, 3]
TreeSet : [3, 2, 1]

 

这里可以看出,Treeset按照我们实现的排序方法按照顺序的打印出了结果。

这里有人可能会问,你的hashset没有添加和treeset相同的排序代码,肯定结果不一样啊;这是因为hashset不支持添加比较器的构造方法,这也说明hashset所存储的元素不需要具备可比较性!

以上个人见解,欢迎评论区纠错。

数据库原理及应用教程课后习题答案 第4版 微课版 陈志泊主编 数据库原理及应用教程 第4版 微课版 陈志泊主编 习题参考答案 阅读详情

相关推荐

STM32的DMA模块及Protues仿真实验

(一)DMA简介      DMA(Direct Memory Access,直接存储器访问), 用于在外设与存储器之间以及存储器与存储器之间提供高速数据传输。可以在无需任何 CPU 操作的情况下通过 DMA 快速移动数据。这样节省的 CPU 资源可 供其它操作使用。      STM32F407共有两个 DMA 控制器,总共有 16 个数据流(每个控制器 8 个),每一个 DMA 控制器都用于管理 一个或多

weixin_45930204的博客 2850

HashSet有序还是无序,如何改为顺序输出

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录HashSet有序还是无序,如何改为顺序输出一、HashSet对于Integer包装类型有序二、对于引用类型,如何进行顺序输出 HashSet有序还是无序,如何改为顺序输出 众所周知,HashSet本质就是HashMap的实现,只取用了其中的Key值。 根据这点可以分析出: 1、HashSet支持null值 2、HashSet不支持重复key值 3、HashSet的key会通过hashcode()方法的返回值决定存放位置 一、Ha

rua123的博客 7329

基于MacOS本地部署OpenClaw+Ollama技术要点

本文基于MacOS系统下本地部署OpenClaw+Ollama的实操经验,梳理部署全流程中的核心技术要点、环境配置规范、故障排查方法及落地优化方案,聚焦“本地AI模型联动OpenClaw技能调度”的核心需求,为同类本地部署场景提供可复用的技术参考,规避常见部署风险,确保系统稳定运行。

在科技赋能新时代,共同探索基础理论和宇宙未知。 5166

为什么HashSet 有时是有序的

HashSet 是真的无序,还是有序的无序 (一) 问题起因 《Core Java Volume I—Fundamentals》中对HashSet的描述是这样的:HashSet:一种没有重复元素的无序集合解释:我们一般说HashSet是无序的,它既不能保证存储和取出顺序一致,更不能保证自然顺序(a-z)下面是《Thinking in Java》中的使用Integer对象的HashSet的示例 import java.util.*; public class SetOfInteger {

高电平的博客 1175

从配置文件加载顺序揭秘:为什么你的logback.xml读不到application.yml?

本文深入解析了Spring Boot中logback.xml无法读取application.yml配置的原因,揭示了Spring Boot配置加载机制与日志系统初始化的时序问题。通过对比logback.xml与logback-spring.xml的差异,提供了使用springProperty标签和系统属性传递等解决方案,帮助开发者有效解决日志配置问题。

weixin_29214335的博客 364

2023-2024深度学习框架之争——选pytorch还是tensorflow?

深度学习是人工智能领域的一个重要分支,它利用多层神经网络来模拟人类的学习和推理能力,解决各种复杂的问题,如图像识别、自然语言处理、语音识别、推荐系统等。深度学习框架是一种软件工具,它提供了构建、训练、测试和部署深度学习模型的便利,使得开发者和研究者可以更高效地进行深度学习的开发和应用。目前,市场上有许多不同的深度学习框架,如PyTorch、TensorFlow、Keras、MXNet、Caffe2等,它们各有优劣,适用于不同的场景和需求。

flchen_nchu的博客 6758

【194期】HashSet 是无序的吗?为什么输出的结果有序?

点击上方“Java精选”,选择“设为星标”别问别人为什么,多问自己凭什么!下方有惊喜,留言必回,有问必答!每天08:15更新文章,每天进步一点点...什么是集合?集合简称集,是数学中一...

Java精选 6618

坐标偏移不一致或瓦块重名的多个OSGB工程的融合

介绍如何使用实景三维小助手OSGBLab对坐标偏移不一致或瓦块重名的多个OSGB工程的融合

OSGBLab的博客 3232

HashMap/HashSet有时出现输出有序问题,即源码分析

我们都知道Set的集合是无序集合的,但是有时却会出现有序;HashSet/HashMap一起说是因为HashSet底层实现就是HashMap HashSet<Integer> hashSet = new HashSet<>(); hashSet.add(3); hashSet.add(1); hashSet.add(7); hashSet.add(5); hashSet.add(4); S

qq_42296117的博客 845

基于深度学习YOLOv10的人脸表情识别系统(附完整资源+PySide6界面+训练代码)

本文介绍了如何基于YOLOv10实现一个人脸表情识别系统。我们从数据集准备、模型训练到PySide6界面实现进行了详细的讲解。通过该系统,用户可以实时检测和分类人脸表情,为情感分析、智能交互等应用场景提供支持。

YOLO 1053

道通无人机信号分析

本文分析了道通无人机及其遥控器的EIRP参数(表1-2),发现不同地区的功率标准存在差异。针对5230MHz图传信号,观测到四帧连续信号结构类似LORA分包传输。脉冲分析(表3)显示固定3.9ms脉宽和1.1ms间隔。频谱异常表现为非矩形窗特征,经分析系多径效应引起的频率选择性衰落所致——不同路径传播导致特定频率出现相长/相消干涉,形成波峰波谷的起伏频谱特征。这种现象与无线信道的多径时延、衰减差异直接相关。

jiaotinglang2580的博客 489

java中list集合、set集合、map集合都分别是有序的还是无序的

java中list集合、set集合、map集合都分别是有序的还是无序的

m0_63615119的博客 7289

端到端自动驾驶的精准测试场景开发

1. 背景介绍 自动驾驶技术的发展正在改变交通运输的未来,然而,要实现安全可靠的自动驾驶,需要进行大量的测试和验证。端到端自动驾驶系统的测试场景开发是实现这一目标的关键。本文将详细介绍端到端自动驾驶的精准测试场景开发,包括核心概念、算法原理、数学模型、项目实践,以及未来发展趋势。 2. 核心概念与联系

AGI×大数据,开启智能时代的认知跃迁;解码AGI,赋能数据驱动的智能革命。 1319

Java-为什么遍历输出HashSet是有序的?

Java遍历HashSet为什么输出是有序的?*Java集合中有序无序的概念一、问题起因二、过程三、总结 *Java集合中有序无序的概念 首先先了解清楚Java集合中有序无序的概念, 有助于更好的理解HashSet为什么输出是有序的!! 有序、无序是指在进行插入操作时,插入位置的顺序性 先插的位置在前,后插的位置在后,则为有序,反之无序 而大家容易混淆的就是排序,排序是指集合内的元素是否按照升序或...

杨的博客 3494

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

Java遍历HashSet为什么输出是有序的?

HashSet 是否无序 来源:知乎BWH.Steven Java 技术公众号:理想二旬不止 (一) 问题起因: 《Core Java Volume I—Fundamentals》中对HashSet的描述是这样的: HashSet:一种没有重复元素的无序集合解释: 我们一般说HashSet是无序的,它既不能保证存储和取出顺序一致,更不能保证自然顺序(a-z) 下面是《Thinking ...

码超的博客 3461

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

hashSet 是有序的吗、怎么保证唯一性

hashSet 是有序的吗?怎么保证元素唯一性? 本文带你了解

leo187的博客 6315

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

遍历HashSet为什么是有序的?

HashSet的迭代器在输出时是输出顺序“不保证有序的”,但是可能会因为某些巧合变得“看似有序”,但是你的程序不应该依赖这样的“巧合”! 例子: public class TestHashSet { public static void main(String[] args) { Set<Integer> set = new HashSet<>(); set.add(5); set.add(1); set.add

qq_43541242的博客 1745

Java HashSet遍历结果为什么有序

作者:BWH.Steven 来源:知乎 HashSet 是否无序 (一) 问题起因: 《Core Java Volume I—Fundamentals》中对HashSet的描述是这样的: HashSet:一种没有重复元素的无序集合 解释:我们一般说HashSet是无序的,它既不能保证存储和取出顺序一致,更不能保证自然顺序(a-z) 下面是《Thinking in Java》中的使用In...

heasy's blog 1594

HashSet 输入为什么是有序的

首先,要明确“不保证有序”和“保证无序”不等价,HashSet的iterator是前者而不是后者,所以在一次运行中看到有序的结果也是正常的,但不能依赖这个有序行为。 况且HashSet并不关心key的“排序”,就算其iterator“有序”通常也是说“按元素插入顺序”(LinkedHashSet就支持插入顺序遍历)。题主在此看到的所谓“有序”纯粹是个巧合。 所以,想要确保有序并且集合中无重

qq_23835497的博客 3183

为什么HashSet遍历输出是有序的?

实现了List接口的集合类全部有序,如ArrayList、LinkedList。而大家容易混淆的就是排序,排序是指集合内的元素是否按照升序或降序来排序。实现了Set接口的集合类中,HashSet无序,TreeSet排序。实现了Map接口的集合类中,HashMap无序,TreeMap排序。先插的位置在前,后插的位置在后,则为有序,反之无序。有序、无序是指在进行插入操作时,插入位置的顺序性。

XF的博客 476

有序的遍历容器 java_Set集合遍历输出有序

所谓无序(unordered),就是 Java 语言没有规定 HashSet 按什么顺序遍历。你应该知道,有好多种 Java 虚拟机。有的运行在Windows上,有的运行在 Linux上。即使在同一个平台上,也会有好几种虚拟机。每种虚拟机对 HashSet的实现都是不一样的,所以每种虚拟机对 HashSet 的遍历顺序可能都不太一样。但对同一种虚拟机来说,你的遍历输出都是一样的。 Java 是跨派...

weixin_29214559的博客 886

HashSet的两种遍历方法

HashSet的两种遍历方法: public static void main(String[] args){ Set<String> set = new HashSet<String>(); set.add("a1"); set.add("b2"); set.add("c3"); set.add("d4"); // 初始化一个...

qq_41562587的博客 1万+

Java_使用List、Map、HashSet、TreeSet存放多个图书信息,遍历并输出

import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Set; /** * 使用List和Map存放多个图书信息,遍历并输出 * 商品属性:编号,名称,单价,出版社 * 使用商品编号作为Map中的key * @a...

Chill Lyn 2349

Java中如何遍历输出HashSet对象中的元素呢?

Java中遍历输出HashSet对象中的元素的方法分享

qq_25073223的博客 1314

对HashSet遍历的不同方法

类 HashSet简介 此类实现 Set 接口,由哈希表(实际上是一个 HashMap 实例)支持。它不保证 set 的迭代顺序;特别是它不保证该顺序恒久不变。此类允许使用 null 元素。(简而言之,set是无序的,允许重复的) 首先定义一个hashSet对象 HashSet set=new HashSet(); set.add(&quot;123&quot;); set.add(101); set.a...

weixin_44540088的博客 5796
上一篇: Kafka基础概念
下一篇: hbase踩坑记录(一):java本地连接远程hbase可是返回zookeeper的地址是localhost
Yuwen_forJava
博客等级 码龄9年 28粉丝 90原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值