java中的集合框架五:Map
2018-06-02 本文已影响0人
在努力中
Map
->是一种映射关系,以键值对的方式存在。可以通过key快速查找到value
->key-value两个属性均可以是任意类型的对象,但是键值对作为整体是以Entry类型的对象实例形式存在
->key不可重复,value可以重复,可以多个key值对应同一个value,但是每个key只能对应到唯一的值(这个值可以是多个键的值)
->Map也是支持泛型的,语法:Map<K,V>
语法Collection不同的是,Map的方法如下
添加、put(K key,V value)
返回key值的集合:keySet()
返回value值的集合:cvalues()
返回键值对的集合:entrySet()
HashMap是Map接口的重要实现类,基于哈希表实现的
HashMap中的对象是无序排列的,key和value都是可以为null,但是一个HashMap只能有一个null的key(key不可重复)
案列学习:
通过Map<String ,Student>进行学生管理
key为学生id,value为学生对象
通过键盘输入学生信息
对学生信息进行增删改查的操作
package collections.collection;
import java.util.HashSet;
import java.util.Set;
/**
*学生类
*/
public class Student {
String id;
String name;
// Set和List一样,都是Collection的子接口
Set<Course> cousers;//因为是可以选多个课程,所以用集合
public Student(String id, String name) {
super();
this.id = id;
this.name = name;
this.cousers = new HashSet<Course>();
}
}
测试类
package collections.collection;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Scanner;
import java.util.Set;
/**
* 1、添加方法
* -|1.put()
* 2、删除方法
* -|2.remove(Object o);//删除集中中的指定元素
* 2、三种返回集合的方法
* -|3.Map的keySet方法----返回所有键
* -|4.entrySet方法,返回Map集合中所有的键值对
* -|
*
* 3、修改 put
* o.get(key) = 对应的value.是键值对上,值的对象,不是具体值(暂时总结这样)
*
*
*/
public class MapTest {
/**
* 用来承装学生类型对象
* Map<String,Student>使用泛型
*/
public Map<String,Student> students;
/**
* 在构造方法中初始化属性 students
* @param args
*/
public MapTest(){
// 在构造方法中,实例化HashMap
this.students = new HashMap<String,Student>();
}
/**
* 1.添加方法,键盘输入学生ID,判断是否被占用
* 如果没有被占用,则继续输入学生姓名,并创建学生对象,添加到students中
* @param args
*/
public void testPut(){
//创建Scanner对象,用来获取输入的学生ID和姓名
Scanner sc = new Scanner(System.in);
/*
* 判断输入的ID是否被占用(是否为空)
*/
// 获取到键盘输入的ID
int i = 0;
while(i<3){
System.out.println("请输入学生的ID");
String ID = sc.next();
Student st = students.get(ID);
// 如果为空,不被占用
if(st == null){
System.out.println("请输入姓名");
String name = sc.next();
// 新建学生对象
Student newStu = new Student(ID, name);
// 调用添加方法 键值对 ID和学生对象
students.put(ID, newStu);
System.out.println("成功添加学生"+students.get(ID).name);
i++;
}else{
System.out.println("该学生ID已被占用");
continue;
}
}
}
/**
* 2.测试删除方法
* @param args
*/
public void testRemove(){
// 输入要删除的ID
System.out.println("请输入要删除的学生的ID:");
Scanner sc = new Scanner(System.in);
while(true){
// 从键盘获取待删除的ID
String ID = sc.next();
// 判断该ID是否有对应的学生对象
Student st = students.get(ID);
if(st == null){
System.out.println("该ID的学生不存在,请重新输入");
continue;//如果是空的,说明是true,因为判断 == null,此时为空返回值为真,循环继续
}
// 如果Id存在不为空。则删除
students.remove(ID);
// System.out.println("33333333333333333333");
System.out.println("成功删除学生 "+st.name+st.id+"ID"+ID);
break;
}
}
/**
* 3.测试Map的keySet方法--返回所有键
* 此时因为已经通过泛型规定了键的类型,所以要用泛型去接受keyset方法返回值
* @param args
*/
public void testKeySet(){
// 通过keyset方法,返回Map集合中所有“键”的Set集合
Set<String> keySet = students.keySet();
System.out.println(keySet.getClass());
// class java.util.HashMap$KeySet
// 遍历输出key值,然后通过get方法来获取value值
System.out.println("一共有 "+keySet.size()+" 个学生");
for (String ID : keySet) {
// 通过get方法来获取value值
Student st = students.get(ID);
//
if(st!=null){
// 遍历出来的iD有学生对象
System.out.println("学生ID:"+ID+" 学生姓名:"+st.name);
}
}
}
/**
* 4.entrySet方法,返回Map集合中所有的键值对
*/
public void testEntrySet(){
// .entrySet方法,返回Map集合中所有的键值对
// Set<Entry> entrySet = students.entrySet();//Entry是Map的一个内部类,Entry本身是泛型
Set<Entry<String, Student>> entrySet = students.entrySet();
for (Entry<String, Student> entry : entrySet) {
System.out.println("取得的键 :"+entry.getKey());
System.out.println("取得的值对象(学生对象) :"+entry.getValue());
System.out.println("取得的值 :"+entry.getValue().name);
System.out.println("取得的值 :"+entry.getValue().id);
}
}
/**
* 5、修改
* @param args
*/
public void testModify(){
// 输入要修改的ID
System.out.println("输入要修改学生的ID");
Scanner sc = new Scanner(System.in);
while(true){
// 取得键盘输入的值
String ID = sc.next();
// 获取ID相对应的对象
Student stu = students.get(ID);
// 判断对象是否存在
if(stu ==null){
System.out.println("该对象不存在,请重新输入");
continue;// 重新循环
}
// 当前对象的name
System.out.println("该ID学生的名字为 "+stu.name);
// 输入新的名字
System.out.println("请输入新的学生名");
String name = sc.next();
// 值重新赋值(这里需要新建学生对象)
Student newStu = new Student(ID,name);
// 修改(赋新值)
students.put(ID, newStu);
System.out.println("修改成功");
break;
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
MapTest mt = new MapTest();
mt.testPut();
mt.testKeySet();
mt.testRemove();
mt.testEntrySet();
mt.testModify();
mt.testKeySet();
}
}