当前位置: 首页 > news >正文

【从零开始学Java | 第二十七篇】HashMap、LinkedHashMap、TreeMap

前言

在上一篇博客中,我们学习了Map接口的特点以及常用的方法,Map接口是我们处理键值对(Key-Value)数据的绝对主力。今天,我们就来深度剖析 Java 中最常用的三大 Map 实现类:HashMapLinkedHashMapTreeMap

一、HashMap

1.HashMap的特点

  • HashMap是Map里面的一个实现类
  • 没有额外需要学习的特有方法,直接使用Map接口里面的方法就可以了。
  • 特点都是由键决定的:无序、不重复、无索引。
  • HashMap和HashSet底层原理是一模一样的,都是哈希表结构
  • 如果键存储的是自定义对象,需要重写hashCode和equals方法;如果值存储的是自定义对象,那么就不需要重写hashCode和equals方法。

利用键计算哈希值,跟值无关。

2.HashMap案例

创建一个HashMap集合,键是学生对象(Student),值是籍贯(String)。

存储几个键值对元素,并遍历。

要求:同姓名,同年龄认为是同一个学生。

首先创建Student Java Bean类。

package com.sprneft.day03; import java.util.Objects; public class Student { private String name; private int age; public Student() { } public Student(String name, int age) { this.name = name; this.age = age; } /** * 获取 * @return name */ public String getName() { return name; } /** * 设置 * @param name */ public void setName(String name) { this.name = name; } /** * 获取 * @return age */ public int getAge() { return age; } /** * 设置 * @param age */ public void setAge(int age) { this.age = age; } public String toString() { return "Student{name = " + name + ", age = " + age + "}"; } }

测试类:

public class Test { public static void main(String[] args) { Student s1 = new Student("张三", 13); Student s2 = new Student("李四", 14); Student s3 = new Student("王五", 15); Student s4 = new Student("赵六", 16); Student s5 = new Student("张三", 13); HashMap<Student, String> hm = new HashMap<>(); hm.put(s1, "广东"); hm.put(s2, "上海"); hm.put(s3, "湖北"); hm.put(s4, "湖南"); hm.put(s5, "广东"); //键找值 Set<Student> students = hm.keySet(); for (Student s : students) { String value = hm.get(s); System.out.println(s.getName() + "," + s.getAge() + "岁,来自" + value); } } }

运行结果:

我们看到两个姓名和年龄都相同的数据,但是存储到HashMap中并没有去重,这是因为我们没有在Student类中重写hashCode和equals方法

重写后结果:

二、LinkedHashMap

1.LinkedHashMap的特点

  • 由键决定:有序、不重复、无索引。
  • 这里的有序指的是保证存储和取出的元素顺序一致
  • 原理:底层数据结构依然是哈希表,只是每个键值对元素又额外多了一个双链表的机制记录存储的顺序。

2.LinkedHashMap案例

public class Test { public static void main(String[] args) { LinkedHashMap<String, Integer> lhm = new LinkedHashMap<>(); lhm.put("c", 123); lhm.put("a", 345); lhm.put("b", 153); lhm.put("a", 111); System.out.println(lhm); } }

运行结果:

三、TreeMap

1.TreeMap的特点

  • TreeMap和TreeSet底层原理一样,都是红黑树结构
  • 由键决定特点:不重复、无索引、可排序
  • 可排序:指的是对键进行排序
  • 默认按照键从小到大进行排序,也可以自己规定键的顺序排序。

2.TreeMap两种排序规则

  • 实现Comparable接口,指定比较规则。
  • 创建集合时传递Comparator比较器对象,指定比较规则。

3.TreeMap案例

①基本数据类型的升序、降序排列:

public class Test { public static void main(String[] args) { TreeMap<Integer, String> tm1 = new TreeMap<>(); tm1.put(1,"苹果"); tm1.put(3,"香蕉"); tm1.put(5,"菠萝"); tm1.put(2,"榴莲"); System.out.println(tm1); TreeMap<Integer, String> tm2 = new TreeMap<>(new Comparator<Integer>() { @Override public int compare(Integer o1, Integer o2) { return o2 - o1; } }); tm2.put(1,"苹果"); tm2.put(3,"香蕉"); tm2.put(5,"菠萝"); tm2.put(2,"榴莲"); System.out.println(tm2); } }

运行结果:

②自定义类型排序:

public class Test { public static void main(String[] args) { TreeMap<Student, String> tm = new TreeMap<>(); tm.put(new Student("张三", 13), "河北"); tm.put(new Student("李四", 10), "湖南"); tm.put(new Student("王五", 19), "广东"); System.out.println(tm); } }

运行结果:

总结

  • 默认首选:首选HashMap,它能解决你绝大部分的问题。

  • 需要记录顺序:只有当你发现遍历Map时,数据的顺序和你插进去的不一样,且这影响了你的业务逻辑时,换成LinkedHashMap

  • 需要按大小排序:当业务明确要求“给我输出排行榜”或者“按时间先后输出日志”时,再考虑使用TreeMap

http://www.jsqmd.com/news/593130/

相关文章:

  • 【节点】[Normalize 节点]原理解析与实际应用
  • 歌词滚动姬:三步快速制作专业LRC歌词的免费开源工具终极指南
  • 实战演练:基于快马平台用countif函数构建电商销售数据分析仪表盘
  • APK Installer深度解析:Windows平台Android应用无缝安装的技术实现与实践指南
  • 苹果用户速自查,30秒排查手机安全风险
  • 2026年降AI工具速度对比:哪款出结果最快还不影响效果
  • 基于国产M0核MCU平台的风机量产程序开发方案及FOC电机控制开发方案:包含龙博格电机观测器与...
  • 题解:[JOI Final 2026] 多方通信 2 / Multi Communication 2
  • 破解微信单向好友困局:WechatRealFriends检测秘诀与高效管理指南
  • 民宿管理|基于springboot + vue民宿管理系统(源码+数据库+文档)
  • 新手福音:用快马平台生成代码,快速上手Cursor编辑器实战
  • MATLAB文件处理进阶:除了按名称和日期,你还能按文件大小、类型甚至内容来排序读取
  • 前端 CSS 精讲 06:定位(position)彻底吃透 —— 实现悬浮、吸顶、覆盖层必备
  • 基于Comsol软件的激光熔覆熔池流动数值模拟:考虑马兰戈尼对流、表面张力、重力、浮力及S活性...
  • Windows 批量文件夹图标设置工具(支持.ico.exe 图标提取与替换)自动扫描每个文件夹中的ICO和EXE图标文件
  • 别再只用默认账户了!深入Thingsboard租户与客户管理,打造企业级物联网SaaS架构
  • AI RAG训练入门到精通(非常详细),搞懂腾讯Search-P1如何超越R1,收藏这篇就够了!
  • 2026年AI编程新范式:“渐进式Spec“
  • 初学者首选!工控视觉项目桌面端WPF源码,UI源码,完美实现前后端MVVM数据绑定,附带两个第...
  • STM32下载异常?从SWDIO连接到供电问题的全面排查指南
  • 效果-VC Reflect 倒影
  • 效率倍增:用快马平台一键生成带反爬优化策略的clawx脚本
  • 从连续到离散:二阶巴特沃斯低通滤波器的工程实现全解析
  • Unity串口通信避坑指南:连接蓝牙手柄时,为什么你的SerialPort总报错?
  • AI写作辅助和AI生成内容有什么区别:AIGC检测的判定逻辑
  • 桌面滚动字幕大师:支持多样滚动方式与自定义样式,适用于各类场景的高效桌面滚动字幕工具
  • 效果-VC Color Vibrance 快速上色
  • ncmdumpGUI:3分钟掌握网易云音乐NCM文件解密转换技巧
  • RVC本地部署实战:从零开始打造AI翻唱模型
  • 【西瓜带你学设计模式 | 第十二期 - 装饰器模式】装饰器模式 —— 动态叠加功能实现、优缺点与适用场景