- Map接口
Map提供了一种映射关系,其中的元素是以键值对(key-value)的形式存储的,key和value可以是任意类型的对象,能够实现根据key快速查找value。
Map中的键值对以Entry类型的对象实例形式存在。
键(key值)不可重复,value值可以。
每个键最多只能映射到一个值,一个值可以对应多个键。
Map接口提供了分别返回key值集合、value值集合以及Entry(键值对)集合的方法。Entry类是Map的一个内部类。
Map支持泛型,形式如:Map<Key值类型,V值类型>
- HashMap类
HashMap是Map的一个重要实现类,也是最常用的,基于哈希表实现。
HashMap中的Entry对象是无序排列的。
Key值和value值都可以为null,但是一个HashMap只能有一个key值为null的映射
MapTest.java
package com.test.collection; import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Map.Entry; import java.util.Scanner; import java.util.Set; public class MapTest { public Map<String, Student> students; public MapTest() { this.students = new HashMap<String, Student>(); } /** * 添加 */ public void testPut(){ Scanner console = new Scanner(System.in); for (int i = 0; i < 3; i++) { System.out.println("输入学生ID:"); String studentId = console.next(); //判断该ID是否被占用 Student st = students.get(studentId); if (st == null) { //提示输入学生姓名 System.out.println("输入学生姓名:"); String studentName = console.next(); //创建学生对象 Student newStudent = new Student(studentId, studentName); //通过调用students的put方法,添加ID-学生映射 students.put(studentId, newStudent); System.out.println("成功添加学生:" + students.get(studentId).name); } else { System.out.println("该学生ID被占用"); continue; } } } /** * 通过keySet方法遍历Map */ public void testKeySet() { //通过keySet方法,返回Map中所有“键”的Set集合 Set<String> keySet = students.keySet(); //获得students的容量 System.out.println("总共有" + students.size() + "个学生"); //遍历keySet,取得每一个键,再调用get方法取得每一个键对应的value for (String stuId : keySet) { Student st = students.get(stuId); if (st != null) { System.out.println("学生:" + st.name); } } } /** * 删除 */ public void testRemove() { Scanner console = new Scanner(System.in); while (true) { System.out.println("请输入要删除学生的ID:"); String studentId = console.next(); Student st = students.get(studentId); if (st == null) { System.out.println("该学生ID不存在"); continue; } students.remove(studentId); System.out.println("成功删除学生:" + st.name); break; } } /** * 通过entrySet方法遍历Map */ public void testEntrySet() { Set<Entry<String, Student>> entrySet = students.entrySet(); System.out.println("总共有" + students.size() + "个学生"); for (Entry<String, Student> entry : entrySet) { System.out.println("key值为:" + entry.getKey()); System.out.println("对应的value为:" + entry.getValue().name); } } /** * 修改 */ public void testModify() { System.out.println("请输入要修改的学生ID"); Scanner console = new Scanner(System.in); while (true) { String studentId = console.next(); Student st = students.get(studentId); if (st == null) { System.out.println("该学生ID不存在"); continue; } System.out.println("当前学生ID,所对应的学生为" + st.name); System.out.println("请输入新的学生的姓名:"); String studentName = console.next(); students.put(studentId, new Student(studentId, studentName)); System.out.println("修改成功"); break; } } public static void main(String[] args) { MapTest mt = new MapTest(); mt.testPut(); mt.testKeySet(); mt.testRemove(); mt.testEntrySet(); mt.testModify(); mt.testEntrySet(); } }
执行结果:
输入学生ID: 1 输入学生姓名: Tom 成功添加学生:Tom 输入学生ID: 2 输入学生姓名: Jack 成功添加学生:Jack 输入学生ID: 3 输入学生姓名: Lucy 成功添加学生:Lucy 总共有3个学生 学生:Tom 学生:Jack 学生:Lucy 请输入要删除学生的ID: 12 该学生ID不存在 请输入要删除学生的ID: 3 成功删除学生:Lucy
总共有2个学生 key值为:1 对应的value为:Tom key值为:2 对应的value为:Jack
请输入要修改的学生ID
2
当前学生ID,所对应的学生为Jack
请输入新的学生的姓名:
Lisa
修改成功
总共有2个学生
key值为:1
对应的value为:Tom
key值为:2
对应的value为:Lisa