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

【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. 引言 前序博客有&#xff1a; Nova: Recursive Zero-Knowledge Arguments from Folding Schemes学习笔记SuperNova&#xff1a;为多指令虚拟机执行提供递归证明基于Nova/SuperNova的zkVMSangria&#xff1a;PLONK Folding2023年 ZK Hack以及ZK Summit 亮点记 主要见2023…...

【蓝桥杯省赛真题22】python剩余空间问题 青少年组蓝桥杯比赛python编程省赛真题解析

目录 python剩余空间问题 一、题目要求 1、编程实现 二、解题思路...

基于深度学习的高精度牙齿健康检测识别系统(PyTorch+Pyside6+YOLOv5模型)

摘要&#xff1a;基于深度学习的高精度牙齿健康检测识别系统可用于日常生活中检测牙齿健康状况&#xff0c;利用深度学习算法可实现图片、视频、摄像头等方式的牙齿目标检测识别&#xff0c;另外支持结果可视化与图片或视频检测结果的导出。本系统采用YOLOv5目标检测模型训练数…...

C++的类

类的性质 上文的例子中用到了类&#xff0c;也知道了类的定义方法&#xff0c;其实类还有更多的性质&#xff0c;这些更多的性质完整支持了面向对象编程。 封装 以前说过&#xff0c;程序就是数据和代码的组合。而C又正好提供了对数据的封装功能&#xff0c;这就可以很好的完…...

【网络】- TCP/IP四层(五层)协议 - 网际层(网络层) - 划分子网、构造超网

目录 一、概述二、分类IP地址不合理的地方三、划分子网四、无分类编址方法 一、概述 前面的文章介绍了网络层的网际协议IP&#xff0c;介绍了IP地址的定义&#xff0c;知道了IP地址分为网络标识(网络地址)、主机标识(主机地址)两部分&#xff0c;也清楚了最初IP地址是按照分类被…...

1-网络初识——网络发展史

目录 1.独立模式 2.网络互联 2.1.局域网&#xff08;Local Area Network&#xff0c;简称LAN&#xff09; ①基于网线直连 ②基于集线器组建 ③基于交换机组建 ④基于交换机&#xff08;网口很多&#xff09;和路由器组建 2.2.广域网&#xff08;Wide Area Network&…...

《Spring Guides系列学习》guide35 - guide40

要想全面快速学习Spring的内容&#xff0c;最好的方法肯定是先去Spring官网去查阅文档&#xff0c;在Spring官网中找到了适合新手了解的官网Guides&#xff0c;一共68篇&#xff0c;打算全部过一遍&#xff0c;能尽量全面的了解Spring框架的每个特性和功能。 接着上篇看过的gu…...

《算法导论》拓展之 一维二维最近点对问题

一维点对问题 描述&#xff1a;一维最近点对问题是指在给定的一维点集中找到距离最近的两个点。具体来说&#xff0c;给定一维坐标轴上的 n 个点&#xff0c;要找出其中的两个点&#xff0c;使它们的距离最小。 解决办法&#xff1a;解决这个问题的一种常见方法是使用排序和线…...

【C++】动态存储分配

动态存储分配是指在程序运行时根据需要动态地分配和释放内存空间。 C中提供了两个关键的运算符用于动态存储分配&#xff1a;new和delete。 使用new运算符可以在堆&#xff08;heap&#xff09;上动态地分配内存空间&#xff0c;并返回所分配内存的首地址。语法如下&#xff1…...

小狗避障-第14届蓝桥杯省赛Scratch中级组真题第4题

[导读]&#xff1a;超平老师的《Scratch蓝桥杯真题解析100讲》已经全部完成&#xff0c;后续会不定期解读蓝桥杯真题&#xff0c;这是Scratch蓝桥杯真题解析第139讲。 小狗避障&#xff0c;本题是2023年5月7日举行的第14届蓝桥杯省赛Scratch图形化编程中级组编程第4题&#xf…...

GPT学习笔记-Embedding的降维与2D,3D可视化

嵌入&#xff08;Embedding&#xff09;在机器学习和自然语言处理中是一种表示离散变量&#xff08;如单词、句子或整个文档&#xff09;的方式&#xff0c;通常是作为高维向量或者矩阵。嵌入的目标是捕捉到输入数据中的语义信息&#xff0c;使得语义相近的元素在嵌入空间中的距…...

Nautilus Chain上线主网,为DeFi和流支付的未来构建基础

近日&#xff0c;加密行业权威平台 Coinmarketcap 发表了一篇名为“Zebec 模块化 Layer3 链 Nautilus Chain上线主网&#xff0c;为 DeFi 和流支付的未来构建基础”的文章&#xff0c;文中对 Zebec 生态公链 Nautilus Chain 的生态进展进行了简要的报道&#xff0c;并对其进行了…...

java设计模式之命令设计模式的前世今生

命令设计模式是什么&#xff1f; 命令设计模式是一种行为型设计模式&#xff0c;它允许将请求封装为对象&#xff0c;并将其传递给调用者&#xff0c;从而使调用者可以在不知道请求具体细节的情况下进行操作。命令模式的主要目的是解耦请求的发送者和接收者&#xff0c;以及通…...

离散系统函数零积点分析

离散系统函数零积点分析 在 Matlab中&#xff0c;系统函数的零极点就可以通过函数 roots 得到。 函数的零极点也可以通过函数 tf2zp 获得&#xff0c;其调用格式为&#xff1a;[Z, P, K] tf2zp(B, A)&#xff0c;函数 tf2zp 可以将H(z)的有理分式转换为零极点增益形式&#…...

Karl Guttag:苹果VST MR头显也无法突破AR的物理局限

据近期的爆料、传闻显示&#xff0c;苹果将6月份的WWDC2023上首次公布AR/VR头显。对此&#xff0c;AR/VR光学专家Karl Guttag持怀疑态度&#xff0c;他此前在DisplayDaily的文章中写道&#xff0c;苹果研发AR/VR头显更像是担心错过新技术趋势。回顾过去的一些关键的AR产品&…...

mysql倒库操作遇到的问题

背景&#xff1a;本地windows 10安装了mysql数据库后&#xff0c;需要把远程库的表结构和数据全部导入进来。 操作&#xff1a;导出数据库&#xff0c;导入数据库。 第一步&#xff1a;导出数据库 使用dump命令即可。 登陆mysql数据库 mysql -hhost --default-character-s…...

ELK企业级日志分析系统

ELK概述 为什么要使用 ELK 日志主要包括系统日志、应用程序日志和安全日志。系统运维和开发人员可以通过日志了解服务器软硬件信息、检查配置过程中的错误及错误发生的原因。经常分析日志可以了解服务器的负荷&#xff0c;性能安全性&#xff0c;从而及时采取措施纠正错误。 …...

华为OD机试真题 Java 实现【基站维修工程师】【2023Q1 200分】,附详细解题思路

一、题目描述 小王是一名基站维护工程师,负责某区域的基站维护。 某地方有n个基站(1<n<10),已知各基站之间的距离s(0<s<500),并且基站x到基站y的距离,与基站y到基站x的距离并不一定会相同。 小王从基站1出发,途径每个基站1次,然后返回基站1,需要请你…...

SSM 如何使用 TCC 机制实现分布式事务?

SSM 如何使用 TCC 机制实现分布式事务&#xff1f; 分布式事务是现代分布式系统中必不可少的一部分&#xff0c;而 TCC 机制&#xff08;Try-Confirm-Cancel&#xff09;是一种常用的分布式事务处理方式。在 SSM 框架中&#xff0c;我们可以使用 TCC 机制来管理分布式事务。本…...

**用Python实现高效分子结构建模与能量计算:从零开始构建你的计算化学工具链**在现代计算化学中,**Python已成

用Python实现高效分子结构建模与能量计算&#xff1a;从零开始构建你的计算化学工具链 在现代计算化学中&#xff0c;Python已成为科研人员首选的编程语言之一&#xff0c;它不仅语法简洁、生态丰富&#xff0c;还具备强大的科学计算能力。本文将带你一步步搭建一个基于Python的…...

基于python的安全信息隐藏技术在数字图像和文本中的应用

一、系统概述 随着信息技术的快速发展&#xff0c;数据泄露与隐私保护问题日益严重。传统的加密技术虽然能有效保护数据的机密性&#xff0c;但在某些特定场合下&#xff0c;数据的“隐蔽性”同样至关重要。隐写术&#xff08;Steganography&#xff09;作为一种安全信息隐藏技…...

[CD326(EpCAM)] 靶点技术深度解析:分子机制、抗体药物开发与未来趋势

在生物制药与细胞生物学研究领域&#xff0c;靶点的选择与机制解析是药物研发的基石。CD326&#xff08;EpCAM&#xff0c;上皮细胞黏附分子&#xff09; 作为一种广泛表达于上皮细胞表面的I型跨膜糖蛋白&#xff0c;不仅是上皮组织稳态维持的关键因子&#xff0c;更是当前抗体…...

KOOK艺术馆入门必看:Streamlit缓存机制与大模型加载优化技巧

KOOK艺术馆入门必看&#xff1a;Streamlit缓存机制与大模型加载优化技巧 想象一下&#xff0c;你刚刚部署了璀璨星河艺术馆&#xff0c;这个界面美得像卢浮宫画廊的AI绘画工具。你兴奋地输入了第一个创意描述&#xff0c;点击生成按钮&#xff0c;然后...开始了漫长的等待。界…...

3步攻克m3u8视频下载:零基础解决方案

3步攻克m3u8视频下载&#xff1a;零基础解决方案 【免费下载链接】m3u8_downloader 项目地址: https://gitcode.com/gh_mirrors/m3/m3u8_downloader 在数字化时代&#xff0c;流媒体内容已成为信息传播的主要形式之一。然而&#xff0c;许多在线视频采用m3u8格式并通过…...

一文了解光储设计一体化系统

在“双碳”战略与新型电力系统建设的双重驱动下&#xff0c;光储融合已成为新能源领域的核心发展方向。传统光储项目常面临光伏与储能设计割裂、容量配置失准、收益难以预判等痛点&#xff0c;而光储设计一体化系统正是解决这些行业难题的核心工具。它以数字化、智能化技术为核…...

m3u8视频下载终极指南:轻松获取加密流媒体内容的完整解决方案

m3u8视频下载终极指南&#xff1a;轻松获取加密流媒体内容的完整解决方案 【免费下载链接】m3u8_downloader 项目地址: https://gitcode.com/gh_mirrors/m3/m3u8_downloader 还在为无法保存在线视频而烦恼吗&#xff1f;m3u8_downloader项目为你提供了简单快速的解决方…...

显卡显存稳定性终极检测指南:memtest_vulkan免费工具快速诊断GPU问题

显卡显存稳定性终极检测指南&#xff1a;memtest_vulkan免费工具快速诊断GPU问题 【免费下载链接】memtest_vulkan Vulkan compute tool for testing video memory stability 项目地址: https://gitcode.com/gh_mirrors/me/memtest_vulkan 核心关键词&#xff1a;显卡显…...

G-Helper实战指南:华硕笔记本性能调优与硬件管理深度解析

G-Helper实战指南&#xff1a;华硕笔记本性能调优与硬件管理深度解析 【免费下载链接】g-helper Lightweight, open-source control tool for ASUS laptops and ROG Ally. Manage performance modes, fans, GPU, battery, and RGB lighting across Zephyrus, Flow, TUF, Strix,…...

终极指南:如何深度调试AMD Ryzen处理器实现性能最大化

终极指南&#xff1a;如何深度调试AMD Ryzen处理器实现性能最大化 【免费下载链接】SMUDebugTool A dedicated tool to help write/read various parameters of Ryzen-based systems, such as manual overclock, SMU, PCI, CPUID, MSR and Power Table. 项目地址: https://gi…...