Map和HashMap
Map接口:
Map 提供了一种映射关系,其中的元素是以键值对(Key-Value)的形式
存储的,能够实现根据Key快速查找value
Map中的键值对以Entry类型的对象实例形式存在
键值(Key) 不可重复,value值可以重复
每个键最多只能映射到一个值
Map接口提供了返回key值集合,value集合以及Entry(键值对)集合的方法
Map支持泛型,形式如:Map<K,V>
HashMap类
HashMap是Map的一个重要实现类,也是最常用的,基于哈希表实现
HashMap中的entry对象是无序排列的
key值和value值都是可以为unll的,但是一个HashMap只能有一个
key值为null的映射(key值不可以重复)
案列功能说明
通过Map<String,Student>进行学生信息管理
其中key值为学生的ID,value为学生的对象
通过键盘输入学生信息
对集合中的学生信息进行增,删,改,查操作
1 import java.util.HashMap; 2 import java.util.Map; 3 import java.util.Map.Entry; 4 import java.util.Scanner; 5 import java.util.Set; 6 7 public class MapTest { 8 9 // 用来承装学生类型对象 // 这里的Student为上次写的Student类 (参考Java之集合框架上(9)) 10 public Map<String, Student> students; 11 // 在构造器中初始化students属性 12 public MapTest(){ 13 this.students = new HashMap<String, Student>(); 14 } 15 16 /* 17 * 测试添加:输入学生ID,判断是否被占用 18 * 若未被占用,则输入姓名,创建学生对象,并且 19 * 添加到students中 20 */ 21 public void testPut(){ 22 // 创建一个Scanner对象,用来获取输入的学生ID和姓名 23 Scanner console = new Scanner(System.in); 24 int i = 0; 25 while (i < 3){ 26 System.out.println("请输入学生ID:"); 27 String ID = console.next(); 28 // 判断ID是否被占用 29 Student st = students.get(ID); 30 if (st == null){ 31 // 提示输入学生姓名 32 System.out.println("请输入学生姓名:"); 33 String name = console.next(); 34 // 创建新的学生对象 35 Student newStudent = new Student(ID,name); 36 // 通过调用students的put方法,添加ID-学生映射 37 students.put(ID, newStudent); 38 System.out.println("成功添加学生:" + students.get(ID).name); 39 i ++; 40 } 41 else{ 42 System.out.println("该学生ID已被占用!"); 43 continue; 44 } 45 } 46 } 47 48 // 测试Map的KeySet方法 49 public void testKeySet(){ 50 // 通过KeySet方法,返回Map中的所有“键”的Set集合 51 Set<String> KeySet = students.keySet(); 52 // 取得students的容量 53 System.out.println("总共有:" + students.size() + "个学生!"); 54 // 遍历KeySet,取得每一个键,在调用get方法取得每一个键对应的value值 55 for (String stuId: KeySet){ 56 Student st = students.get(stuId) ; 57 if (st != null){ 58 System.out.println("学生:" + st.name); 59 } 60 } 61 } 62 63 // 测试删除Map中已有的映射 64 public void testRemove(){ 65 // 获取从键盘输入的待删除学生ID字符串 66 Scanner console = new Scanner(System.in); 67 while(true){ 68 // 提示输入待删除的学生的ID 69 System.out.println("请输入要删除的学生ID!"); 70 String ID = console.next(); 71 // 判断ID是否有对应的学生对象 72 Student st = students.get(ID); 73 if (st == null){ 74 // 提示输入的ID并不存在 75 System.out.println("该ID不存在!"); 76 continue; 77 } 78 students.remove(ID); 79 System.out.println("成功删除学生:" + st.name); 80 break; 81 } 82 } 83 84 // 通过entrySet方法来遍历Map 85 public void testEntrySet(){ 86 // 通过entrySet方法,返回Map中的所有键值对 87 Set<Entry <String,Student>> entrySet = students.entrySet(); 88 for (Entry<String, Student> entry:entrySet){ 89 System.out.println("取得键:" + entry.getKey()); 90 System.out.println("对应的值:" + entry.getValue().name); 91 92 } 93 } 94 95 // 利用put方法修改Map中已有映射 96 public void testModify(){ 97 // 提示输入要修改的学生ID 98 System.out.println("请输入要修改的学生ID:"); 99 // 创建一个Scanner对象,去获取从键盘上输入的学生ID字符串 100 Scanner console = new Scanner(System.in); 101 while (true ){ 102 // 取得从键盘输入的学生ID 103 String stuID = console.next(); 104 // 从students中查找该学生ID对应学生对象 105 Student student = students.get(stuID); 106 if (student == null){ 107 System.out.println("该ID不存在!请从新输入!"); 108 continue; 109 } 110 // 提示当前对应学生对象的姓名 111 System.out.println("当前学生ID,所对应的学生为:" + student.name); 112 // 提示输入新的学生姓名,来修改已有映射 113 System.out.println("请输入新的学生姓名:"); 114 String name = console.next(); 115 Student newStudent = new Student(stuID,name); 116 students.put(stuID, newStudent); 117 System.out.println("修改成功!"); 118 break; 119 } 120 } 121 122 public static void main(String[] args) { 123 124 MapTest mt = new MapTest(); 125 mt.testPut(); 126 mt.testKeySet(); 127 mt.testRemove(); 128 mt.testEntrySet(); 129 mt.testModify(); 130 mt.testEntrySet(); 131 } 132 133 }