【JavaSE】Java基础语法(三十):HashMap与TreeMap

news2024/9/9 0:13:15

文章目录

  • 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;
	}
	
	@Override
	public 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;
	}
	
	@Override
	public 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;
	}
	
	@Override
	public String toString() {
		return "Student{" +
		"name='" + name + '\'' +
		", age=" + age +
		'}';
	}
	
	@Override
	public 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,值是Integer
	TreeMap<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,以保证线程安全。


在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/584387.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Xline 持久化存储设计与实现

01、引言 在 Xline 早期的原型阶段&#xff0c;我们采用了基于内存的存储来实现数据的持久化。这虽然简化了 Xline 原型设计的复杂度&#xff0c;提高了项目的开发和迭代速度&#xff0c;但带来的影响也是显著的&#xff1a;由于数据都存储在内存当中&#xff0c;因此一旦当进…

TOOM舆情监控黑科技:AI破解人心,预测社会未来!

近年来&#xff0c;随着人工智能技术的快速发展&#xff0c;舆情监控正逐渐进入一个全新的时代。利用人工智能技术&#xff0c;舆情监控能够洞察人心&#xff0c;预测社会未来的走向&#xff0c;这项黑科技引发了广泛的关注和探讨。 舆情监控是通过对社会舆论的搜集、分析和评…

盛元广通生物样本库管理系统

生物样本库管理系统&#xff0c;作为一种高效、智能化的信息管理工具&#xff0c;在现代生物研究中扮演着重要的角色。随着科学技术的不断进步&#xff0c;生物样本的采集、保存和管理变得越来越重要&#xff0c;而盛元广通生物样本库管理系统正是为了解决这一问题而应运而生的…

无缝对接多语言:参数校验的终极指南(一)!

前言 在此之前&#xff0c;写过在两篇文章&#xff0c;是关于如何在 SpringBoot 内实现统一参数校验和自定义校验注解的。毕竟作为后端来讲&#xff0c;对于前端传来的数据&#xff0c;需要保持高度的警惕。避免出现异常数据&#xff0c;导致系统异常。统一参数校验和自定义校验…

现在的00后,真是卷死了呀,辞职信已经写好准备提交了·····

都说00后躺平了&#xff0c;但是有一说一&#xff0c;该卷的还是卷。这不&#xff0c;四月份春招我们公司来了个00后&#xff0c;工作没两年&#xff0c;跳槽到我们公司起薪22K&#xff0c;都快接近我了。 后来才知道人家是个卷王&#xff0c;从早干到晚就差搬张床到工位睡觉了…

自从用了 EasyExcel,导入导出 Excel 更简单了!

EasyExcel 在做excel导入导出的时候,发现项目中封装的工具类及其难用,于是去gitHub上找了一些相关的框架,最终选定了EasyExcel。之前早有听闻该框架&#xff0c;但是一直没有去了解&#xff0c;这次借此学习一波&#xff0c;提高以后的工作效率。 实际使用中&#xff0c;发现…

服了呀,00后怎么这么卷....

现在的小年轻真的卷得过分了。前段时间我们公司来了个00年的&#xff0c;工作没两年&#xff0c;跳槽到我们公司起薪18K&#xff0c;都快接近我了。后来才知道人家是个卷王&#xff0c;从早干到晚就差搬张床到工位睡觉了。 最近和他聊了一次天&#xff0c;原来这位小老弟家里条…

FDA辅料数据库-在线查询网址

在药物的制剂研发过程中&#xff0c;辅料是不可或缺的。然而&#xff0c;在使用辅料时需要明确其安全使用量&#xff0c;这并非易事。因此&#xff0c;美国FDA 辅料数据库&#xff08;IID&#xff09;成为了一个重要的参考标准&#xff0c;对于制剂开发提供了帮助。 如果研发人…

《汇编语言》- 读书笔记 - 第7章- 更灵活的定位内存地址的方法

《汇编语言》- 读书笔记 - 第7章- 更灵活的定位内存地址的方法 7.1 and 和 or 指令7.2 关于 ASCII 码7.3 以字符形式给出的数据程序 7.1 7.4 大小写转换的问题7.5 [bxidata] &#xff08;变量 固定偏移量&#xff09;问题 7.1 7.6 用[bxidata]的方式进行数组的处理7.7 SI 和 D…

软件测试测试环境搭建很难?一天学会这份测试环境搭建教程

如何搭建测试环境&#xff1f;这既是一道高频面试题&#xff0c;又是困扰很多小伙伴的难题。因为你在网上找到的大多数教程&#xff0c;乃至在一些培训机构的课程&#xff0c;都不会有详细的说明。 你能找到的大多数项目&#xff0c;是在本机电脑环境搭建环境&#xff0c;或是…

Linux服务器上如何安装OpenCV的库?

Linux上安装OpenCV其实挺简单的。对于Python来说&#xff0c;可以直接使用pip进行安装&#xff0c;如&#xff1a; pip3 install opencv-python 当然&#xff0c;如果你是想在C或者Java内作为外部包使用&#xff0c;你可以考虑编译安装。 安装依赖 首先是依赖安装问题&#…

LED屏控制卡

LED屏控制卡&#xff08;LED Screen Control Card&#xff09;是一种用于控制和管理LED显示屏的关键设备。它通常是一个硬件设备&#xff0c;具有处理器、存储器、接口和软件功能&#xff0c;用于接收、解码和显示图像、视频和其他多媒体内容。 以下是LED屏控制卡的一些重要特点…

JVM (基础概念、类加载过程、垃圾回收算法)

目录 一、JVM 是什么 二、JVM 运行流程 三、Java运行时数据区 1、程序计数器&#xff08;线程私有&#xff09; 2、栈区&#xff08;线程私有&#xff09; 3、堆 4、方法区 四、OOM内存溢出和内存泄漏 1、OOM内存溢出 2、内存泄漏 五、类加载过程 1、加载 2、连接…

PMP课堂模拟题目及解析(第14期)

131. 项目经理正在制定干系人参与计划&#xff0c;并识别到一位权力等级较高但在项目中兴趣较低的干系人&#xff0c;项目经理应该如何对待该干系人&#xff1f; A. 重点管理 B. 随时告知 C. 监督 D. 令其满意 132. 项目经理识别到项目干系人具有明显不同的需求和期望。…

不合格机器人工程专业讲师笔记-230529-

工作八年&#xff0c;最大的遗憾&#xff0c;就是对不起学生&#xff0c;对不起同事&#xff0c;对不起领导&#xff0c;各项工作都没有做好。 但是由于个人水平低&#xff0c;能力差&#xff0c;唯一能做的就是在忏悔中不断总结&#xff0c;避免一次又一次失败。 一万句&…

别让测试岗位的坑太大,10年老鸟亲身经历告诉你如何避开陷阱

测试岗位一直是IT行业中备受争议的一个职业&#xff0c;有人看重其重要性&#xff0c;有人则认为这是个巨坑。如果你也对测试岗位存在疑虑和担忧&#xff0c;那么这篇文章一定能帮到你&#xff01; 作者是一位在测试领域摸爬滚打了10年的老鸟&#xff0c;他深刻地理解了测试工…

行业报告 | 智能制造在中国—中国机器视觉产业链现状分析

文 | BFT机器人 导语 Introduction 智能制造装备是指具有感知、分析、推理、决策、控制功能的制造装备&#xff0c;它是先进制造技术、信息技术和智能技术的集成和深度融合&#xff0c;体现了制造业智能化、数字化和网络化的发展要求。智能制造装备的水平已成为当今衡量一个国家…

数据类岗位面试随想录

数据分析或者是偏向数据分析的数据开发岗&#xff0c;要求无非就是SQL、Python和业务相关的问题。 1 SQL问答 基本这些问题和期末考试的难度比&#xff0c;是简单的。和学校所教的比&#xff0c;基本超纲的问题只会有窗口函数。这一部分面试官一般不会问你难的问题&#xff0c…

通用支付系统设计

支付永远是一个公司的核心领域&#xff0c;因为这是一个有交易属性公司的命脉。那么&#xff0c;支付系统到底长什么样&#xff0c;又是怎么运行交互的呢?抛开带有支付牌照的金融公司的支付架构&#xff0c;下述链路和系统组成基本上符合绝大多数支付场景。其实整体可以看成是…

【人脸识别】insightface 使用记录和搭建服务注意点 从0到1

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言1.开始1.1 前置1.2 再次运行&#xff0c;人脸检测跑通 前言 人脸识别项目&#xff0c;再走一遍。之前是公司老人留下的&#xff0c;没部署过&#xff0c;没交付…