哎呦我, HashMap KeySet有序? 好像是哈

news2024/11/28 14:31:40

背景:有8个格子,上架物品时需要从第一个格子开始上架,不能跳格子,也就是说 如果格子1空着,就不能把物品放到格子2。有这么个顺序的情况

前人模块功能实现: 用HashMap 初始化格子信息,然后用 KeySet() 去遍历找到第一个空的格子。

印象中HashMap 是无序的啊!!!
仔细想想,HashMap 是数组 + 链表 + 红黑树, 因为Hash的原因无法保证插入顺序等于KeySet 遍历顺序。但是 相同的一组数据无论插入顺序怎么样,遍历顺序都是一样的。因为存储的结果是一样的嘛。

回到这里看,key为1 ~ 8的8个格子放到HashMap 中,初始size 为16 ,不会出现Hash冲突的情况,那就是数组结构中 1 ~ 8分别占据1个桶,又因为 1 ~ 8 的Hash值逐渐增加,所以——有序!!! 这个真的,我服了 orz.

来测试一下我们的猜想:


    public static void main(String[] args) {
//        System.out.println(new Match().match("aaa".toCharArray(), "a.a".toCharArray()));

        HashMap<String, String> map = new HashMap<String, String>();
        map.put("1", "1格子");
        map.put("2", "2格子");
        map.put("3", "3格子");
        map.put("4", "4格子");
        map.put("5", "5格子");
        map.put("6", "6格子");
        map.put("7", "7格子");
        map.put("8", "8格子");
//        map.put("9", "9格子");
//        map.put("10", "10格子");
//        map.put("11", "11格子");

        for (String position: map.keySet()) {
            System.out.println(position  + ", Hash:" + position.hashCode() + ", " + map.get(position));
        }
    }

输出是这样的
在这里插入图片描述
有意思嗨!看插入这里果然是
在这里插入图片描述
拿出笔来算算啊
49: 110001 & 1111 = 0001 桶
50: 110010 & 1111 = 0010 桶
51: 110011 & 1111 = 0011 桶
52: 110100 & 1111 = 0100 桶
53: 110101 & 1111 = 0111 桶
54: 110110 & 1111 = 0110 桶
55: 110111 & 1111 = 0111 桶
56: 111000 & 1111 = 1000 桶
……

这里确实能满足这个场景的需求,那这里的扩展性呢?产品一旦扩格子,就废了,因为这个最多支持到10 内有序!还是不要这么玩了(如果是炫技,那你赢了)

如下扩到11 个格子的时候就不行了,因为 “11” 的hash 是1568
11000100000 & 1111 = 0000 桶,顺序就没了
在这里插入图片描述
哎,这里的Key现在是 String 类型,用Int类型的话Hash 是不是就又有序了!
来试试

public static void main(String[] args) throws IOException {
//        System.out.println(new Match().match("aaa".toCharArray(), "a.a".toCharArray()));

        HashMap<Integer, String> map = new HashMap<Integer, String>();

        for (int i = 1; i < 1000; i ++) {
            map.put(i, i + "格子");
        }

        File file = new File("out.log");
        FileWriter fw = new FileWriter(file);
        int lastVal = 0;
        for (Integer position: map.keySet()) {
            fw.write(position  + ", Hash:" + position.hashCode() + ", " + map.get(position) + "\n");
            if (lastVal > position) {
                System.err.println(lastVal + "," + position);
            }
            lastVal = position;

//            System.out.println(position  + ", Hash:" + position.hashCode() + ", " + map.get(position));
        }
    }

在这里插入图片描述
那Int类型到多大就保证不了顺序呢?

答案是65537 和 65536 的顺序就颠倒了。

虽然目前这个业务的格子数不太可能扩到65536 这个大小,但是建议不要用这种方式去做排序。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1851390.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Docker:centos79-docker-compose安装记录

1.安装环境&#xff1a;centos7.9 x86 2.安装最新版&#xff1a; [rootlocalhost ~]# curl -fsSL get.docker.com -o get-docker.sh [rootlocalhost ~]# sh get-docker.sh # Executing docker install script, commit: e5543d473431b782227f8908005543bb4389b8desh -c yum in…

STM32硬件接口I2C应用(基于FT6336)

目录 概述 1 硬件介绍 1.1 ST7796-LCD 1.2 MCU IO与LCD PIN对应关系 1.3 MCU IO与Touch PIN对应关系 2 FT6336的寄存器 2.1 FT6336寄存器列表 2.2 寄存器功能介绍 3 STM32Cube控制配置I2C 3.1 软硬件版本信息 3.2 I2C参数配置 3.3 使用STM32Cube产生工程 4 HAL库…

深入了解RTMP推流技术:视频汇聚EasyCVR低延迟与高稳定性分析

RTMP&#xff08;Real Time Messaging Protocol&#xff09;视频推流技术&#xff0c;作为音视频传输领域的关键技术之一&#xff0c;已经在直播、视频会议、在线教育等多个场景中得到了广泛应用。RTMP以其独特的优势&#xff0c;为实时音视频传输提供了高效、稳定的解决方案。…

前端路线指导(4):前端春招秋招经验分享

春招/秋招经验分享(前端) 哈喽大家好&#xff0c;我是小粉&#xff0c;双一流本科&#xff0c;自学前端一年&#xff0c;收获腾讯&#xff0c;字节等多家大厂offer&#xff0c;一半以上ssp~ 今天给大家分享一下我的春招&#xff08;暑期实习&#xff09;、秋招经历&#xff0c;…

咖啡事故,上海Manner咖啡店,1天两起店员和顾客发生冲突

上海咖啡店Manner&#xff0c;一天的时间竟然发生两起店员和员工发生肢体冲突&#xff1a; 事情详情&#xff1a; Manner威海路716店事件: 店员泼顾客咖啡粉&#xff0c;随后被辞退品牌方回应媒体&#xff0c;表示将严肃处理Manner梅花路门店事件:顾客因等待时间长抱怨&…

Docker部署MySQL8.3.0(保姆级图文教程)

系列文章目录 Docker部署Nginx1.21.5&#xff08;保姆级图文教程&#xff09; Docker部署MySQL8.3.0&#xff08;保姆级图文教程&#xff09; 文章目录 一、环境二、拉取镜像2.1 查找 Docker Hub 上的 MySQL 镜像2.2 拉取MySQL镜像2.3 查看MySQL镜像 三、在宿主机创建目录3.1 创…

查看LabVIEW及各个模块和驱动的版本号

要方便地查看当前计算机上安装的LabVIEW版本以及各个模块和驱动的版本号&#xff0c;可以使用以下几种方法&#xff1a; 1. 使用NI MAX (Measurement & Automation Explorer) NI MAX 是一个强大的工具&#xff0c;可以帮助你管理National Instruments硬件、软件和驱动程序…

5G/4G/北斗遥测终端机全国各省水利平台无缝对接

物联网技术的广泛应用正在深刻影响水利行业&#xff0c;计讯物联致力于推动水利技术的持续革新和服务的持续升级&#xff0c;依托国家级专业水利资质认证&#xff0c;在多个大型水利项目中展现的项目管理专长&#xff0c;为水利项目建设提供了高效的解决方案&#xff0c;持续推…

通用大模型的低代码平台——3分钟内快速搭建一个邮件提醒工具

文章目录 ⭐前言⭐node-koa开发一个发送邮件的api⭐百度智能云控制面板&#x1f496; 发送邮件的组件配置&#x1f496; 配置应用发布 ⭐总结⭐结束 ⭐前言 大家好&#xff0c;我是yma16&#xff0c;通用大模型的低代码平台——3分钟内快速搭建一个智能股票分析邮件提醒工具。…

OpenCV Mat实现图像四则运算及常用四则运算的API函数

装载有图像数据的OpenCV Mat对象&#xff0c;可以说是一个图像矩阵&#xff0c;可以进行加、减、乘、除运算。特别是加运算特别有用。 一 与常数的四则运算 与常数的加运算 示例&#xff1a; #include <iostream> #include <opencv2/opencv.hpp>using namespace …

Google Adsense----Wordpress插入谷歌广告

1.搭建个人博客,绑定谷歌search consol,注册adsense 详细可以参考这个视频b站视频 2.将个人博客网站关联到Adsense 在adsense里新加网站,输入你的博客网址,双击网站 将这段代码复制到header.php的里面 在wordpress仪表盘的外观-主题文件编辑器,找到header.php将代码复制,…

有玩家在2011年的MacBook上成功运行了Windows XP 还安装了触摸屏

我们已经在许多不同的设备上看到过 Windows XP 正在运行。这个古老的操作系统于 2001 年正式推出&#xff0c;现在已经老到其最后一次软件更新是在近十年前。一位好奇的玩家试图在 2011 年的触摸屏 MacBook 上为 Windows XP 打造了一个新家&#xff0c;复古技术探索者 Michael …

vmware虚拟机安装ubuntu20.04

1.下载Ubuntu 20.04的ISO镜像 Index of /ubuntu-releases/ 2.安装VMware 3.创建新的虚拟机&#xff1a;打开VMware&#xff0c;选择“创建新的虚拟机”或通过文件菜单新建虚拟机。 4.选择典型&#xff0c;然点点击下一步&#xff1a; 5.选择稍后安装操作系统&#xff1a; 6.…

LLC开关电源开发:第四节,LLC软件设计报告

LLC源代码链接 数控全桥LLC开发板软件设计报告  1. LLC硬件及软件框架2. LLC软件设计2.1 工程文件说明2.2 LLC中断设计2.2.1 20us中断2.2.2 5ms中断 2.3 LLC状态机设计2.3.1 初始化状态2.3.2 空闲状态2.3.3 软启动状态2.3.4 正常运行状态2.3.5 故障状态 2.4 环路设计2.4.1 环路…

1095 解码PAT准考证(测试点3)

solution 测试点3超时&#xff1a;命令为3时&#xff0c;用unordered_map而非map&#xff0c;否则会超时 #include<iostream> #include<string> #include<algorithm> #include<unordered_map> using namespace std; const int maxn 1e4 10; struct…

实战|YOLOv10 自定义目标检测

引言 YOLOv10[1] 概述和使用自定义数据训练模型 概述 由清华大学的研究团队基于 Ultralytics Python 包研发的 YOLOv10&#xff0c;通过优化模型结构并去除非极大值抑制&#xff08;NMS&#xff09;环节&#xff0c;提出了一种创新的实时目标检测技术。这些改进不仅实现了行业领…

Appium + Python App自动化第一个脚本

今天跟大家讲解一个Appium和Python App自动化的脚本。 【1】打开你的夜神模拟器&#xff08;或者连接你的手机&#xff09; 【2】打开桌面的Appium 【3】下载你要测的App的apk文件&#xff0c;放到桌面 【4】拖动你的apk安装包到夜神模拟器里&#xff0c;然后模拟器会提示你…

pyinstaller, cx_Freeze打包 pyqt 桌面应用-实操

1 pyinstaller 打包成 exe 参考这个连接&#xff0c; 写的比较全面&#xff1a; https://blog.csdn.net/qq_48979387/article/details/132359366 唯一发现一个错误是增加资源文件时候的分隔符(-add-data SOURCE:DEST)&#xff0c; 按照自己环境的实际的情况来&#xff1a; $…

CS162 Operating System-lecture2

A tread is suspended or no longer executing when its state’s not loaded in registers the point states is pointed at some other thread .so the thread that’s suspended is actually siting in memory and not yet executing or not executing at all with some thi…