Java Map集合操作实战指南
一、实验实训目的和要求
1、掌握Map集合对象的创建
2、掌握Map基于集合的元素添加、元素查询、元素删除、遍历集合等操作
3、掌握Map集合在项目功能中的应用
4、通过实验体会集合的灵活应用
二、实验实训器材(包括仪器、设备、主要试剂或元器件、软件等)
3.1 计算机设备
操作系统:建议使用 Windows或 macOS 等主流操作系统,确保系统稳定且已安装 Java 开发环境(JDK),JDK 版本建议为Java8、Java 17 或Java 21。
处理器:具备基本的计算处理能力,能够流畅运行 Java 程序。一般来说,普通的笔记本电脑或台式机处理器均可满足需求,如英特尔酷睿系列或 AMD 锐龙系列处理器。
内存:至少 8GB 及以上的内存,以保证在编译和运行 Java 程序时系统不会因内存不足而出现卡顿或异常。
3.2 开发工具
集成开发环境(IDE):推荐使用 IntelliJ IDEA专业的 Java 开发工具,这些 IDE 提供了代码编辑、编译、调试等功能,能够极大地提高开发效率。当然,也可以使用简单的文本编辑器(如 Notepad++、Sublime Text 等)结合命令行工具进行 Java 开发,但对开发者的要求相对较高。
Java 开发工具包(JDK):作为 Java 开发的核心工具包,包含了 Java 编译器(javac)、Java 运行时环境(JRE)等必要的工具和库。确保 JDK 已正确安装并配置好环境变量,以便在命令行或 IDE 中能够正常使用 Java 相关命令。
3.3 其他辅助工具
文档编辑器:用于记录实验过程、回答思考题等,如 Microsoft Word、WPS 文字处理软件等。
截图工具:用于截取程序代码和运行结果图。
三、实验实训内容和主要操作步骤
2.1 验证性实验
1、验证一下功能是否符合题目要求:
定义一个Map集合,利用键值对存储相关信息,以键存储工号-Integer类型,值存储员工姓名-String类型,按照要求完成以下功能:
- 利用键遍历的方式遍历Map集合
- 利用键值对的方式遍历Map集合
- 输入一个工号,查询员工姓名,如果不存在,则打印输出”查无此人”
- 输入一个员工姓名,查询此员工是否存在,存在-打印输出员工信息,否则打印输出”查无此人”
2、验证一下功能是否符合题目要求:
定义一个银行用户 BankUser 类,用户信息为用户 id、用户名 userName、余额 balance。
(1)利用 HashMap 存储用户信息:id作为键,用户作为值,创建多个用户对象进行存储;
(2)遍历打印输出所有银行的用户名和对应的余额;
(3)键盘输入一个用户名,检测是否存在此用户,存在-打印用户信息;不存在-打印查无此;
(4)打印输出余额大于 200000 的用户信息。
代码如下:
public class BankUser { private int id; private String userName; private double balance; // 构造方法 public BankUser(int id, String userName, double balance) { this.id = id; this.userName = userName; this.balance = balance; } // getter方法 public int getId() { return id; } public String getUserName() { return userName; } public double getBalance() { return balance; } // 重写toString方法,方便打印用户信息 @Override public String toString() { return "用户ID: " + id + ", 用户名: " + userName + ", 余额: " + balance; } } import java.util.HashMap; import java.util.Map; import java.util.Scanner; import java.util.Set; public class BankUserManagement { public static void main(String[] args) { // 1. 创建HashMap存储用户信息,id作为键,用户对象作为值 Map<Integer, BankUser> bankUsers = new HashMap<>(); // 添加多个用户对象 bankUsers.put(1001, new BankUser(1001, "张三", 150000.0)); bankUsers.put(1002, new BankUser(1002, "李四", 250000.0)); bankUsers.put(1003, new BankUser(1003, "王五", 300000.0)); bankUsers.put(1004, new BankUser(1004, "赵六", 180000.0)); bankUsers.put(1005, new BankUser(1005, "钱七", 220000.0)); // 2. 遍历打印所有银行用户的用户名和对应的余额 System.out.println("=== 所有用户的用户名和余额 ==="); Set<Map.Entry<Integer, BankUser>> entries = bankUsers.entrySet(); for (Map.Entry<Integer, BankUser> entry : entries) { BankUser user = entry.getValue(); System.out.println("用户名: " + user.getUserName() + ", 余额: " + user.getBalance()); } // 3. 键盘输入用户名,检测是否存在此用户 Scanner scanner = new Scanner(System.in); System.out.println("请输入要查询的用户名: "); String searchName = scanner.nextLine(); boolean exists = false; for (BankUser user : bankUsers.values()) { if (user.getUserName().equals(searchName)) { System.out.println("找到用户: " + user); exists = true; break; } } if (!exists) { System.out.println("查无此用户"); } // 4. 打印输出余额大于200000的用户信息 System.out.println("=== 余额大于200000的用户 ==="); for (BankUser user : bankUsers.values()) { if (user.getBalance() > 200000) { System.out.println(user); } } scanner.close(); } }
|
2.2 自主设计性实验
3、以下为已知某学校的教学课程内容安排,完成指定要求:
(1) 使用 Map,以老师的名字作为键,教授的课程名作为值,表示上述课程安排
(2) 增加了一位新老师 Allen 教 JDBC
(3) Lucy 改为教 CoreJava
(4) 遍历 Map,输出所有的老师及老师教授的课程
(5) 利用 Map,输出所有教 JSP 的老师
(6) 统计教授 CoreJava 和 JDBC 老师的人数
4、利用Map,完成下面的功能:
从命令行读入一个字符串,表示一个年份,输出该年的世界杯冠军是哪支球队。如果该年没有举办世界杯,则输出:没有举办世界杯。
附录:截止2025 年,历届世界杯冠军以及对应的夺冠年份:
5、在上一题目的基础上,增加如下功能:输入一支球队的名字,输出该球队夺冠的年份列表。
例如:
- 输入“巴西”,应当输出1958、1962、1970、1994、2002
- 输入“荷兰”,应当输出”没有获得过世界杯”。
五、实验实训结论与思考
1、Java 中的 Map 集合是什么?它和 Set、List 集合的主要区别是什么?
分析:
Map集合的定义: Map 是 Java 集合框架中的一个接口,用于存储键 - 值对(Key - Value pair),通过键(Key)可以快速查找对应的值(Value)。
- 与 Set 、 List 的主要区别:
- List :是有序的集合,元素可重复,通过索引(如 list.get(0) )访问元素,关注元素的“顺序”和“可重复存储”。
- Set :是无序的集合,元素不可重复,关注“元素的唯一性”。
- Map :存储的是键 - 值对,键(Key)具有唯一性(同一 Map 中不能有重复的键),值(Value)可重复;它不直接存储“单个元素”,而是通过键关联值,核心是“键值映射关系”。
- Map 集合中 “键(Key)” 和 “值(Value)” 的关系是什么?键可以重复吗?值可以重复吗?
分析:
键(Key)和值(Value)的关系:在 Map 中,键(Key)是用于查找的“索引”,值(Value)是与键关联的“数据”,每个键唯一对应一个值,即通过键能唯一确定一个值。
- 键和值的重复性:
- 键(Key)不可以重复:同一 Map 中如果有重复的键,后添加的键值对会覆盖先添加的(因为键要保证唯一性,用于准确查找)。
- 值(Value)可以重复:不同的键可以对应相同的值。
- HashMap 是 Map 的常见实现类,它有什么特点?比如键是否允许为 null?
分析:
HashMap 是 Map 接口的常用实现类,具有以下特点:
- 存储结构:基于哈希表(数组 + 链表/红黑树)实现,利用哈希算法提高查找、插入、删除的效率。当链表长度超过阈值(默认 8)且数组长度大于等于 64 时,链表会转化为红黑树,进一步优化查找性能。
- 键的规则:
- 键(Key)允许为 null ,但只能有一个键为 null 的键值对。
- 有序性: HashMap 是无序的,即元素的存储顺序和插入顺序无关。
- 线程安全性: HashMap 是非线程安全的,如果在多线程环境下使用,可能会出现线程安全问题。
