1.插入无序

public class HashMapTest {public static void main(String[] args) {HashMap<String, String> map = new HashMap<>();map.put("Liyuanfang", "射手");map.put("Yuange", "刺客");map.put("Zhugeliang", "法师");map.put("Xiahoudun", "坦克");map.put("Guiguzi", "辅助");System.out.println("第一次输出:");for (Map.Entry<String, String> entry : map.entrySet()) {System.out.println(entry.getKey());}System.out.println("\n第二次输出:");for (Map.Entry<String, String> entry : map.entrySet()) {System.out.println(entry.getKey());}}
}

自己运行一下就能看到,输出顺序与插入顺序无关

2.遍历有序

public class HashMapTest {public static void main(String[] args) {HashMap<String, String> map1 = new HashMap<>();map1.put("Liyuanfang", "射手");map1.put("Yuange", "刺客");map1.put("Zhugeliang", "法师");map1.put("Xiahoudun", "坦克");map1.put("Guiguzi", "辅助");System.out.println("map1循环遍历:");for (map1.Entry<String, String> entry : map1.entrySet()) {System.out.println(entry.getKey());}HashMap<String, String> map2 = new HashMap<>();map2.put("Liyuanfang", "射手");map2.put("Yuange", "刺客");map2.put("Zhugeliang", "法师");map2.put("Xiahoudun", "坦克");map2.put("Guiguzi", "辅助");System.out.println("map2循环遍历:");for (map2.Entry<String, String> entry : map2.entrySet()) {System.out.println(entry.getKey());}}
}

两个Map,put的key值相同,但是两个Map最后循环遍历输出的key顺序却不一样。

3.HashMap的一些特性

  • HashMap的数据结构:数组+单链表,当存在hashCode相同的不同对象时,会将value以单链表的形式,往后追加。数组加快访问速度,单链表解决hash值冲突
  • 调用put方法时,发生了什么:根据key的hashCode,计算出将key放入数组的index下标,index= (数组长度 - 1) & hashCode
  • HashMap循环遍历的顺序:根据数组顺序+单链表顺序进行输出。虽然遍历时,用的EntrySet,但是可以简单理解为,两层循环输出数据,外层循环为遍历数组,内层循环为遍历单链表
  • HashMap在初始化时,默认初始容量为16,以及默认的扩容因子0.75

4.分析

基于HashMap的特性:

HashMap<String, String> map2 = new HashMap<>(map1.size());

即:map2的初始化容量=map1.size()。
这个设置,导致相同的key,在put到map2时,计算出的index值,与map1中的不一样
因为计算index时,依赖于数组的长度(参考上面:put方法调用说明)

5.结论

  • 若两个Map的初始化容量不一致,就算同时插入相同的key,最后输出的顺序,不一定一致
  • 想要依赖Map保持有序性,请使用LinkedHashMap 或 直接new HashMap<>()

第二个代码段,如果将:

HashMap<String, String> map2 = new HashMap<>(map1.size());

修改成:

HashMap<String, String> map2 = new HashMap<>();

那么 map1 和 map2的输出顺序是一致的。

HashMap有序性与无序性阐述相关推荐

  1. HashMap散列无序存储测试

    为什么80%的码农都做不了架构师?>>>    package com.boonya.map; import java.util.HashMap; import java.util. ...

  2. .NET(C#):警惕PLINQ结果的无序性

    .NET(C#):警惕PLINQ结果的无序性 2012年08月10日 ⁄ 综合 ⁄ 共 620字 ⁄ 字号 小 中 大 ⁄ 评论关闭 PLINQ的运行结果是无序的,也就是不保持原来集合的顺序来操作(当 ...

  3. golang map的无序性验证

    map的无序性 大量数据如果没有写入,只是读取不会出错 var wg sync.WaitGroupm := make(map[int]int)for i := 0; i < 10000; i++ ...

  4. 点云的无序性_基于深度学习的激光雷达点云物体识别方法总结

    0. 前言: 激光雷达作为自动驾驶不可或缺的传感器,随着价格不断下降,各种基于深度学习的模型也层出不穷(坐等马斯克打脸); 激光雷达物体识别的任务: 输入: 激光点云(x, y, z, intensi ...

  5. 网易之小易最近在数学课上学习到了集合的概念,集合有三个特征:1.确定性 2.互异性 3.无序性.需要根据给定的w,x,y,z,求出集合中一共有多少个元素。

    import java.util.HashSet; import java.util.Scanner; import java.util.Set;/*** 小易最近在数学课上学习到了集合的概念,集合有 ...

  6. C# 实现多分屏视频播放-自定义控件集合无序性问题

    参考:自定义控件使其填充方格且自动变换大小文章,据此生成了多分屏的视频播放器.这里需要注意Controls的数组的无序性. 这里看下自定义控件的代码: using System; using Syst ...

  7. HashMap遍历有序性问题——map.entrySet()的无序性

    在LeetCode刷题的时候,在一道返回 字符串中最早出现的只出现一次的字符下标的题目中,使用大HashMap的遍历方式,我选择了使用map.entrySet()获取节点集合的方式进行遍历. 题目和代 ...

  8. 点云的无序性_PU-Net:解决3D点云数据的上采样问题

    作者:Danny明泽 论文下载: https://openaccess.thecvf.com/content_cvpr_2018/papers/Yu_PU-Net_Point_Cloud_CVPR_2 ...

  9. 拒绝传统电销无序性,智能外呼系统规范电销全流程

    电销模式的存在由来已久,也在时间的长河里迭代更新,最早期一个小规模的公司,配备几个人+几台座机,就可以风生水起地开展业务,再后来连座机都不用,人手一个手机就可以随时随地做电销,但随着社会经济的发展和市 ...

最新文章

  1. IE6左右边框断线现象
  2. python中线条颜色_python中plot用法——线条、点、颜色
  3. linux安装redis插件,Linux平台安装redis及redis扩展的方法
  4. sql server中case when的用法
  5. svnsync 服务器代码备份
  6. poj 2503 Babelfish trie树!!!!指针版和数组版 基础
  7. 第七次会议(4.22)
  8. 【Android 10 源码】深入理解 MediaCodec configure
  9. LaTeX详细安装步骤和简明教程
  10. 波束形成(最大信噪比准则、LCMV、MSC、LMS、RLS)
  11. 电箱吉他与原声吉他的区别在哪里?初学者应该选哪个呢?
  12. 图像处理基本方法-python语言生成纯色BMP文件
  13. 2021年美容师(初级)考试资料及美容师(初级)
  14. linux centos7 iptables配置
  15. java.lang.IllegalArgumentException: Failed to decrypt.
  16. T1加权像(T1 weighted image,T1WI)
  17. 崔发周 教育部计算机,高等职业技术教育人才培养目标体系及其构建_崔发周
  18. 遗传算法:交叉操作 NWOX 2006
  19. USB、串口、422、485、CAN接口互转模块
  20. 软件工程的前景与发展

热门文章

  1. 怎么利用群控解决问题
  2. linux系统安装搜狗输入法
  3. the android sdk location cannot be at the filesystem root. 问题解决
  4. FastAPI上传POST嵌套JSON对象及List列表BaseModel,python
  5. python爬虫之爬取起点中文原创小说排行榜
  6. 彻底解决PPt一直弹出mathtype错误信息
  7. Angular CLI ng常用命令整理
  8. 【转】键盘灯亮无反映解决方法
  9. 直播间自动发言互动的思路和实现步骤,和打包成APP的方法
  10. java.io.FileNotFoundException: D:\hadoop (拒绝访问。)