news 2026/5/29 22:56:00

Java Map学习笔记:HashMap、LinkedHashMap 与 TreeMap 的核心使用与区别

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Java Map学习笔记:HashMap、LinkedHashMap 与 TreeMap 的核心使用与区别

Java内置的集合框架,除了提供Collection单列集合外,还提供所谓双列集合Map,即所谓存储“键值对”的集合。键和值是两个对象,而键值对在Java中称为entry。

与Collection相似,Map是一个接口,有HashMap、LinkedHashMap和TreeMap三种实现类,这三种实现类与Set的三种实现类(HashSet、LinkedHashSet和TreeSet)在底层实现上相同。实际上,Map只是比Set增加了一个“值对象”。准确来说,HashSet的内部实现基于 HashMap,将其值视为一个固定值。因此,Map具有与Set相似特点:不保证顺序、键不可重复(但值可重复)、不可索引。

Map的方法与Set也很相似,但是额外多了有关值的方法。Map常见方法如下:

Vput(Kkey,Vvalue);// 添加键值对,如果键存在会返回旧值,如果键不存在则返回nullVremove(Objectkey);// 删除键值对,返回旧值。若键不存在则返回nullbooleanremove(Objectkey,Objectvalue);// 删除指定键值对voidclear();// 清空MapVget(Objectkey);// 获取指定键的值booleancontainsKey(Objectkey);// 是否包含键booleancontainsValue(Objectvalue);// 是否包含值intsize();// 元素数量booleanisEmpty();// 是否为空

对常见方法的代码演示如下:

publicclassDemo0{publicstaticvoidmain(String[]args){// 创建Map集合对象Map<String,String>map=newHashMap<>();// boolean isEmpty(); 判断集合是否为空System.out.println(map.isEmpty());// true// V put(K key, V value); 添加键值对,如果键存在会返回旧值,同时覆盖旧值,如果键不存在则返回nullSystem.out.println(map.put("郭靖","黄蓉"));// nullSystem.out.println(map.put("杨过","小龙女"));// nullSystem.out.println(map.put("韦小宝","沐剑屏"));// nullSystem.out.println(map.put("韦小宝","阿珂"));// 沐剑屏System.out.println(map);// {郭靖=黄蓉, 杨过=小龙女, 韦小宝=阿珂}// int size(); 获取键值对数量System.out.println(map.size());// 3System.out.println(map.isEmpty());// false// boolean containsKey(Object key); 判断集合中是否包含指定的键System.out.println(map.containsKey("郭靖"));// trueSystem.out.println(map.containsKey("小龙女"));// false// boolean containsValue(Object value); 判断集合中是否包含指定的值System.out.println(map.containsValue("阿珂"));// trueSystem.out.println(map.containsValue("沐剑屏"));// false// V remove(Object key); 删除键值对,返回旧值。若键不存在则返回nullSystem.out.println(map.remove("郭靖"));// 黄蓉System.out.println(map.remove("小龙女"));// null}}

Map的遍历有三种方式:

  1. 通过键找值:获取Map中的所有key为新Set,再通过key找到value。
  2. 通过键值对:获取Map中的键值对对象成一个新Set,再遍历键值对对象找key、value。
  3. 使用foreach方法用lamda表达式
publicclassDemo1{publicstaticvoidmain(String[]args){// 创建Map集合Map<String,String>map=newHashMap<>();// 添加元素map.put("郭靖","黄蓉");map.put("杨过","小龙女");map.put("韦小宝","沐剑屏");// 遍历方法1: 通过键找值:获取Map中的所有key为新单列集合,再通过key找到value。Set<String>keys=map.keySet();// keySet()方法获取Map中的所有key集合for(Stringkey:keys){Stringvalue=map.get(key);// get(key)方法通过key找到valueSystem.out.println(key+"="+value);}System.out.println("---------分割线-----------");// 遍历方法2: 通过键值对:获取Map中的键值对对象成一个新单列集合,再遍历键值对对象找key、value。Set<Map.Entry<String,String>>entries=map.entrySet();// entrySet()方法获取Map中的键值对对象集合for(Map.Entry<String,String>entry:entries){Stringkey=entry.getKey();// Entry对象的getKey()方法获取keyStringvalue=entry.getValue();// Entry对象的getValue()方法获取valueSystem.out.println(key+"="+value);}System.out.println("---------分割线-----------");// 遍历方法3: 通过foreach方法map.forEach((key,value)->System.out.println(key+"="+value));}}

HashMap

HashMap是Map的实现类,底层使用哈希表。

HashMap与HashSet相似,HashSet节点Node中存储的内容是元素本身,而HashMap存储的内容是键值对对象,又称为Entry对象。

HashMap的元素插入逻辑:

  1. 将键和值两个对象,组成一个键值对Entry对象
  2. 用键调用hashCode()方法,计算键的哈希值
  3. 通过哈希值和哈希表数组的长度,计算数组索引值
  4. 若数组为null,则存储键值对对象
  5. 若数组不为null,则调用equals()方法,逐一判断链表中已存在的键值对的键,是否相等
  6. 若键相同,则覆盖键值对对象
  7. 若链表中的键都不同,则最后插入到链表尾部。

因此,若用HashMap,与HashSet相似,需要重写键类的hashCode()和equals()方法。

LinkedHashMap

LinkedHashMap是Map的实现类,底层使用哈希表。

LinkedHashMap与HashMap的关系,就跟LinkedHashSet与HashSet的关系相似,LinkedHashMap是在HashMap的节点基础上,增加了指向上一个插入元素Entry对象的节点和指向下一个插入元素Entry对象的节点。

因此,LinkedHashMap特点是有序、键不重复、不可索引。如下可以看出,遍历获取的顺序与插入顺序相同:

publicclassDemo2{publicstaticvoidmain(String[]args){// 创建一个Map集合对象Map<Student,String>map=newLinkedHashMap<>();// 添加三个元素map.put(newStudent("张三",18),"成都");map.put(newStudent("李四",19),"上海");map.put(newStudent("王五",20),"北京");// 遍历键值对for(Map.Entry<Student,String>entry:map.entrySet()){System.out.println(entry.getKey()+"="+entry.getValue());}}}
Student{name='张三',age=18}=成都 Student{name='李四',age=19}=上海 Student{name='王五',age=20}=北京 进程已结束,退出代码为0

TreeMap

TreeMap是Map的实现类,底层使用红黑树。

TreeMap与TreeSet相似,HashSet节点Node中存储的内容是元素本身,而HashMap存储的内容是键值对对象,又称为Entry对象。

树这一数据结构要求存储的元素需要能够比较,因此TreeMap存储的键值对对象的键也需要支持比较。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/29 1:49:05

SQL查询优化建议:VibeThinker辅助编写复杂多表连接

SQL查询优化新范式&#xff1a;VibeThinker驱动的智能多表连接生成 在电商大促期间&#xff0c;一个简单的“按品类统计活跃用户消费总额”的报表请求&#xff0c;竟让数据库响应时间飙升到分钟级——这样的场景在中大型系统中屡见不鲜。问题往往出在SQL语句本身&#xff1a;嵌…

作者头像 李华
网站建设 2026/5/29 0:21:28

数据化赋能技术转移:构建开放协同的科技创新新生态

科易网AI技术转移与科技成果转化研究院 在全球化竞争加剧和科技创新迭代加速的时代背景下&#xff0c;技术转移作为科技成果转化的重要桥梁&#xff0c;其效率与质量直接影响着创新生态系统的活力。传统技术转移模式受制于信息不对称、资源分散、匹配效率低等痛点&#xff0…

作者头像 李华
网站建设 2026/5/29 1:08:39

【Docker监控避坑手册】:资深架构师亲授6大高危陷阱及应对策略

第一章&#xff1a;Docker性能监控的核心价值与挑战在现代云原生架构中&#xff0c;Docker作为容器化技术的基石&#xff0c;广泛应用于微服务部署与资源隔离。然而&#xff0c;随着容器数量的快速增长和部署复杂度的提升&#xff0c;对运行时性能的可观测性提出了更高要求。有…

作者头像 李华
网站建设 2026/5/28 22:19:15

无法修补的漏洞:PS5 BootROM密钥遭泄露,索尼安全防线崩塌

上周&#xff0c;一名身份不明的黑客泄露了索尼用于保护PlayStation 5游戏机信任链的关键安全密钥。这类被称为BootROM的安全密钥是索尼安全信任架构的核心组件。理论上&#xff0c;该密钥的曝光为未来针对游戏机的破解工作奠定了重要基础。BootROM密钥的核心作用BootROM密钥是…

作者头像 李华
网站建设 2026/5/1 18:22:00

前端基础三剑客

一、HTML&#xff1a;页面的骨架 核心作用&#xff1a;定义页面的结构和语义&#xff0c;告诉浏览器 “显示什么内容”。 基础语法 标签&#xff1a;分为双标签&#xff08;<div></div>、<p></p>&#xff09;和单标签&#xff08;<img/>、<…

作者头像 李华
网站建设 2026/5/28 15:37:14

娱乐-虚拟偶像:实时渲染引擎性能测试

虚拟偶像产业与实时渲染引擎的崛起 随着数字娱乐产业的爆发式增长&#xff0c;虚拟偶像&#xff08;如初音未来、洛天依&#xff09;已成为全球现象。这些虚拟角色依赖实时渲染引擎&#xff08;如Unity或Unreal Engine&#xff09;在直播、演唱会等场景中实现高保真交互。然而…

作者头像 李华