【JavaSE】Java基础语法(三十):HashMap与TreeMap
文章目录
- 1. HashMap
- 1.1 HashMap集合概述和特点
- 1.2 HashMap集合应用案例
- 2. TreeMap
- 2.1 TreeMap集合概述和特点
- 2.2 TreeMap集合应用案例一
- 2.3 TreeMap集合应用案例二
- 3. 总结

1. HashMap
1.1 HashMap集合概述和特点
- HashMap底层是哈希表结构的
- 依赖hashCode方法和equals方法保证键的唯一
- 如果键要存储的是自定义对象,需要重写hashCode和equals方法
1.2 HashMap集合应用案例
案例需求
- 创建一个HashMap集合,键是学生对象(Student),值是居住地 (String)。存储多个元素,并
遍历。 - 要求保证键的唯一性:如果学生对象的成员变量值相同,我们就认为是同一个对象
代码实现
public class Student {private String name;private int age;public Student() {}public Student(String name, int age) {this.name = name;this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}@Overridepublic boolean equals(Object o) {if (this == o) return true;if (o == null || getClass() != o.getClass()) return false;Student student = (Student) o;if (age != student.age) return false;return name != null ? name.equals(student.name) : student.name ==null;}@Overridepublic int hashCode() {int result = name != null ? name.hashCode() : 0;result = 31 * result + age;return result;}
}
public class HashMapDemo {public static void main(String[] args) {//创建HashMap集合对象HashMap<Student, String> hm = new HashMap<Student, String>();//创建学生对象Student s1 = new Student("刘亦菲", 30);Student s2 = new Student("宋祖儿", 35);Student s3 = new Student("林黛玉", 33);Student s4 = new Student("林黛玉", 33);//把学生添加到集合hm.put(s1, "西安");hm.put(s2, "武汉");hm.put(s3, "郑州");hm.put(s4, "北京");//遍历集合Set<Student> keySet = hm.keySet();for (Student key : keySet) {String value = hm.get(key);System.out.println(key.getName() + "," + key.getAge() + "," + value);}}
}
2. TreeMap
2.1 TreeMap集合概述和特点
- TreeMap底层是红黑树结构
- 依赖自然排序或者比较器排序,对键进行排序
- 如果键存储的是自定义对象,需要实现Comparable接口或者在创建TreeMap对象时候给出比较器
排序规则
2.2 TreeMap集合应用案例一
案例需求
- 创建一个TreeMap集合,键是学生对象(Student),值是籍贯(String),学生属性姓名和年龄,按照年
龄进行排序并遍历 - 要求按照学生的年龄进行排序,如果年龄相同则按照姓名进行排序
代码实现
public class Student implements Comparable<Student>{private String name;private int age;public Student() {}public Student(String name, int age) {this.name = name;this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}@Overridepublic String toString() {return "Student{" +"name='" + name + '\'' +", age=" + age +'}';}@Overridepublic int compareTo(Student o) {//按照年龄进行排序int result = o.getAge() - this.getAge();//次要条件,按照姓名排序。result = result == 0 ? o.getName().compareTo(this.getName()) :result;return result;}
}
public class Test1 {public static void main(String[] args) {// 创建TreeMap集合对象TreeMap<Student,String> tm = new TreeMap<>();// 创建学生对象Student s1 = new Student("xiaohei",23);Student s2 = new Student("dapang",22);Student s3 = new Student("xiaomei",22);// 将学生对象添加到TreeMap集合中tm.put(s1,"江苏");tm.put(s2,"北京");tm.put(s3,"天津");// 遍历TreeMap集合,打印每个学生的信息tm.forEach((Student key, String value)->{System.out.println(key + "---" + value);});}
}
2.3 TreeMap集合应用案例二
案例需求
- 给定一个字符串,要求统计字符串中每个字符出现的次数。
- 举例: 给定字符串是“aababcabcdabcde”,在控制台输出: “a(5)b(4)c(3)d(2)e(1)”
代码实现
public class Test2 {public static void main(String[] args) {// 给定字符串String s = "aababcabcdabcde";// 创建TreeMap集合对象,键是Character,值是IntegerTreeMap<Character,Integer> tm = new TreeMap<>();//遍历字符串,得到每一个字符for (int i = 0; i < s.length(); i++) {//c依次表示字符串中的每一个字符char c = s.charAt(i);// 判断当前遍历到的字符是否在集合中出现过if(!tm.containsKey(c)){//表示当前字符是第一次出现。tm.put(c,1);}else{//存在,表示当前字符已经出现过了//先获取这个字符已经出现的次数Integer count = tm.get(c);//自增,表示这个字符又出现了依次count++;//将自增后的结果再次添加到集合中。tm.put(c,count);}}// a(5)b(4)c(3)d(2)e(1)//System.out.println(tm);tm.forEach((Character key,Integer value)->{System.out.print(key + "(" + value + ")");});}
}
3. 总结
HashMap和TreeMap都是常用的Java集合框架中的映射类型,实现了Java中Map接口,并且具有不同的特点和使用场景。
HashMap的特点:
- 根据键的hashCode值存储数据,因此具有很快的访问速度;
- 允许使用null作为键和值;
- 不保证元素的顺序,在遍历元素时无法按照任何顺序输出。
TreeMap的特点:
- 按照键排序存储数据,因此可以保证元素按照一定顺序输出,这种顺序可以通过key的自然顺序或者自定义排序器决定;
- 不允许使用null作为键,但可以使用null作为值。
在具体使用时,需要根据数据的特点和需要进行选择。
如果需要快速的查找、插入、删除操作,并且对元素的顺序没有特别要求,那么就应该使用HashMap。
如果需要按照键排序并且对元素的顺序有明确要求,那么可以使用TreeMap。同时,在需要在多线程环境下进行操作时,可以使用ConcurrentHashMap来代替HashMap,以保证线程安全。

相关文章:
【JavaSE】Java基础语法(三十):HashMap与TreeMap
文章目录 1. HashMap1.1 HashMap集合概述和特点1.2 HashMap集合应用案例 2. TreeMap2.1 TreeMap集合概述和特点2.2 TreeMap集合应用案例一2.3 TreeMap集合应用案例二 3. 总结 1. HashMap 1.1 HashMap集合概述和特点 HashMap底层是哈希表结构的依赖hashCode方法和equals方法保…...
Sangria:类似Nova folding scheme的relaxed PLONK for PLONK
1. 引言 前序博客有: Nova: Recursive Zero-Knowledge Arguments from Folding Schemes学习笔记SuperNova:为多指令虚拟机执行提供递归证明基于Nova/SuperNova的zkVMSangria:PLONK Folding2023年 ZK Hack以及ZK Summit 亮点记 主要见2023…...
【蓝桥杯省赛真题22】python剩余空间问题 青少年组蓝桥杯比赛python编程省赛真题解析
目录 python剩余空间问题 一、题目要求 1、编程实现 二、解题思路...
基于深度学习的高精度牙齿健康检测识别系统(PyTorch+Pyside6+YOLOv5模型)
摘要:基于深度学习的高精度牙齿健康检测识别系统可用于日常生活中检测牙齿健康状况,利用深度学习算法可实现图片、视频、摄像头等方式的牙齿目标检测识别,另外支持结果可视化与图片或视频检测结果的导出。本系统采用YOLOv5目标检测模型训练数…...
C++的类
类的性质 上文的例子中用到了类,也知道了类的定义方法,其实类还有更多的性质,这些更多的性质完整支持了面向对象编程。 封装 以前说过,程序就是数据和代码的组合。而C又正好提供了对数据的封装功能,这就可以很好的完…...
【网络】- TCP/IP四层(五层)协议 - 网际层(网络层) - 划分子网、构造超网
目录 一、概述二、分类IP地址不合理的地方三、划分子网四、无分类编址方法 一、概述 前面的文章介绍了网络层的网际协议IP,介绍了IP地址的定义,知道了IP地址分为网络标识(网络地址)、主机标识(主机地址)两部分,也清楚了最初IP地址是按照分类被…...
1-网络初识——网络发展史
目录 1.独立模式 2.网络互联 2.1.局域网(Local Area Network,简称LAN) ①基于网线直连 ②基于集线器组建 ③基于交换机组建 ④基于交换机(网口很多)和路由器组建 2.2.广域网(Wide Area Network&…...
《Spring Guides系列学习》guide35 - guide40
要想全面快速学习Spring的内容,最好的方法肯定是先去Spring官网去查阅文档,在Spring官网中找到了适合新手了解的官网Guides,一共68篇,打算全部过一遍,能尽量全面的了解Spring框架的每个特性和功能。 接着上篇看过的gu…...
《算法导论》拓展之 一维二维最近点对问题
一维点对问题 描述:一维最近点对问题是指在给定的一维点集中找到距离最近的两个点。具体来说,给定一维坐标轴上的 n 个点,要找出其中的两个点,使它们的距离最小。 解决办法:解决这个问题的一种常见方法是使用排序和线…...
【C++】动态存储分配
动态存储分配是指在程序运行时根据需要动态地分配和释放内存空间。 C中提供了两个关键的运算符用于动态存储分配:new和delete。 使用new运算符可以在堆(heap)上动态地分配内存空间,并返回所分配内存的首地址。语法如下࿱…...
小狗避障-第14届蓝桥杯省赛Scratch中级组真题第4题
[导读]:超平老师的《Scratch蓝桥杯真题解析100讲》已经全部完成,后续会不定期解读蓝桥杯真题,这是Scratch蓝桥杯真题解析第139讲。 小狗避障,本题是2023年5月7日举行的第14届蓝桥杯省赛Scratch图形化编程中级组编程第4题…...
GPT学习笔记-Embedding的降维与2D,3D可视化
嵌入(Embedding)在机器学习和自然语言处理中是一种表示离散变量(如单词、句子或整个文档)的方式,通常是作为高维向量或者矩阵。嵌入的目标是捕捉到输入数据中的语义信息,使得语义相近的元素在嵌入空间中的距…...
Nautilus Chain上线主网,为DeFi和流支付的未来构建基础
近日,加密行业权威平台 Coinmarketcap 发表了一篇名为“Zebec 模块化 Layer3 链 Nautilus Chain上线主网,为 DeFi 和流支付的未来构建基础”的文章,文中对 Zebec 生态公链 Nautilus Chain 的生态进展进行了简要的报道,并对其进行了…...
java设计模式之命令设计模式的前世今生
命令设计模式是什么? 命令设计模式是一种行为型设计模式,它允许将请求封装为对象,并将其传递给调用者,从而使调用者可以在不知道请求具体细节的情况下进行操作。命令模式的主要目的是解耦请求的发送者和接收者,以及通…...
离散系统函数零积点分析
离散系统函数零积点分析 在 Matlab中,系统函数的零极点就可以通过函数 roots 得到。 函数的零极点也可以通过函数 tf2zp 获得,其调用格式为:[Z, P, K] tf2zp(B, A),函数 tf2zp 可以将H(z)的有理分式转换为零极点增益形式&#…...
Karl Guttag:苹果VST MR头显也无法突破AR的物理局限
据近期的爆料、传闻显示,苹果将6月份的WWDC2023上首次公布AR/VR头显。对此,AR/VR光学专家Karl Guttag持怀疑态度,他此前在DisplayDaily的文章中写道,苹果研发AR/VR头显更像是担心错过新技术趋势。回顾过去的一些关键的AR产品&…...
mysql倒库操作遇到的问题
背景:本地windows 10安装了mysql数据库后,需要把远程库的表结构和数据全部导入进来。 操作:导出数据库,导入数据库。 第一步:导出数据库 使用dump命令即可。 登陆mysql数据库 mysql -hhost --default-character-s…...
ELK企业级日志分析系统
ELK概述 为什么要使用 ELK 日志主要包括系统日志、应用程序日志和安全日志。系统运维和开发人员可以通过日志了解服务器软硬件信息、检查配置过程中的错误及错误发生的原因。经常分析日志可以了解服务器的负荷,性能安全性,从而及时采取措施纠正错误。 …...
华为OD机试真题 Java 实现【基站维修工程师】【2023Q1 200分】,附详细解题思路
一、题目描述 小王是一名基站维护工程师,负责某区域的基站维护。 某地方有n个基站(1<n<10),已知各基站之间的距离s(0<s<500),并且基站x到基站y的距离,与基站y到基站x的距离并不一定会相同。 小王从基站1出发,途径每个基站1次,然后返回基站1,需要请你…...
SSM 如何使用 TCC 机制实现分布式事务?
SSM 如何使用 TCC 机制实现分布式事务? 分布式事务是现代分布式系统中必不可少的一部分,而 TCC 机制(Try-Confirm-Cancel)是一种常用的分布式事务处理方式。在 SSM 框架中,我们可以使用 TCC 机制来管理分布式事务。本…...
PCB封装核心构成—焊盘,电气连接的基石
在电子设计与制造领域,PCB 封装是连接虚拟电路设计与实体元器件的关键纽带,而焊盘则是 PCB 封装中最核心、最基础的构成要素,堪称电气连接的 “基石”。没有精准设计的焊盘,元器件与电路板之间的电气连接便无从谈起,整…...
LAV Filters完整教程:如何让Windows播放器支持所有视频格式
LAV Filters完整教程:如何让Windows播放器支持所有视频格式 【免费下载链接】LAVFilters LAV Filters - Open-Source DirectShow Media Splitter and Decoders 项目地址: https://gitcode.com/gh_mirrors/la/LAVFilters LAV Filters是一套基于ffmpeg的开源Di…...
Qwen3-TTS声音设计模型5分钟快速部署:10种语言语音合成一键搞定
Qwen3-TTS声音设计模型5分钟快速部署:10种语言语音合成一键搞定 1. 为什么选择Qwen3-TTS声音设计模型? 1.1 用自然语言"设计"声音,不是选择音色 传统语音合成工具通常提供固定音色库,而Qwen3-TTS的VoiceDesign功能允…...
WebGLStudio.js虚拟文件系统完全指南:如何高效管理3D资源
WebGLStudio.js虚拟文件系统完全指南:如何高效管理3D资源 【免费下载链接】webglstudio.js A full open source 3D graphics editor in the browser, with scene editor, coding pad, graph editor, virtual file system, and many features more. 项目地址: http…...
4大维度全面掌控Cyber Engine Tweaks:打造专属赛博朋克2077体验
4大维度全面掌控Cyber Engine Tweaks:打造专属赛博朋克2077体验 【免费下载链接】CyberEngineTweaks Cyberpunk 2077 tweaks, hacks and scripting framework 项目地址: https://gitcode.com/gh_mirrors/cy/CyberEngineTweaks 🌟 引擎核心&#x…...
终极解决方案:让Mac通过Android USB网络共享高速上网的HoRNDIS驱动
终极解决方案:让Mac通过Android USB网络共享高速上网的HoRNDIS驱动 【免费下载链接】HoRNDIS Android USB tethering driver for Mac OS X 项目地址: https://gitcode.com/gh_mirrors/ho/HoRNDIS 还在为Mac无法直接使用Android手机的USB网络共享功能而烦恼吗…...
ai赋能开发:让快马平台智能助手教你如何用最新jdk特性重构旧代码
今天在维护一个老项目时,发现了一段基于JDK 8的用户过滤排序代码。作为一个持续关注Java新特性的开发者,我决定用最新JDK 17的特性来重构这段代码。正好最近在用InsCode(快马)平台做项目,发现它的AI辅助功能特别适合用来做这种代码现代化改造…...
别再傻等下载了!用ISO镜像装VS2015,教你手动复制packages文件夹绕过报错
突破VS2015离线安装困境:手动复制packages文件夹的终极指南 当你在一个网络受限的环境中尝试安装Visual Studio 2015时,可能会遇到一个令人沮丧的问题——安装程序反复提示"安装包丢失或损坏"。这种情况尤其常见于使用ISO镜像文件进行离线安装…...
7个必备OpenCore Legacy Patcher技巧:从基础安装到性能优化
7个必备OpenCore Legacy Patcher技巧:从基础安装到性能优化 【免费下载链接】OpenCore-Legacy-Patcher Experience macOS just like before 项目地址: https://gitcode.com/GitHub_Trending/op/OpenCore-Legacy-Patcher OpenCore Legacy Patcher是一款让老款…...
3分钟搞定!为Word安装APA第7版参考文献样式的完整指南
3分钟搞定!为Word安装APA第7版参考文献样式的完整指南 【免费下载链接】APA-7th-Edition Microsoft Word XSD for generating APA 7th edition references 项目地址: https://gitcode.com/gh_mirrors/ap/APA-7th-Edition 还在为学术论文的参考文献格式而烦恼…...
