集合框架(中):Map
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值都可以为null,但是一个HashMap只能有一个key值为null的映射(key值不可以重复)
例子:通过添加学生到学生库中,并显示学生信息
Students类
package com.collection; import java.util.HashSet;
import java.util.Set; /**
* @学生类
*
*/ public class Student { public String id;
public String name;
public Set<Course> courses;
public Student(String id,String name)
{
this.id=id;
this.name=name;
this.courses=new HashSet<Course>();
} }
1.MapTest类
添加信息
package com.collection; import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
import java.util.Set; public class MapTest { /**
* @param args
*/ //用来承装学生类型的对象
public Map<String,Student> students; //构造器中初始化students数属性
public MapTest(){
students = new HashMap<String,Student>();
} /**
*测试添加:输入学生ID,判断是否被占用
*若未被占用,则输入学生姓名,创建学生对象,并且
*添加到students中
*/
public void testPut(){
Scanner console = new Scanner(System.in);
int i=0;
while(i<3){
System.out.println("请输入学生ID");
String ID = console.next();
//判断学生ID是否已经存在
Student st = students.get(ID);
if(st==null){
//提示输入学生姓名
System.out.println("请输入学生姓名");
String name = console.next();
//创建新的学生对象
Student newStudent = new Student(ID,name);
//通过调用students的put方法,添加ID-学生映射
students.put(ID, newStudent);
System.out.println("成功添加学生:"+students.get(ID).name);
i++;
}else{
System.out.println("该学生ID已被占用");
continue;
}
}
} //测试Map的keySet方法
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.id+"_"+st.name);
}
}
} public static void main(String[] args) {
// TODO 自动生成的方法存根
MapTest mt = new MapTest();
mt.testPut();
mt.testKeySet(); } }

注:HashMap是无序的。所以每次运行显示学生信息的时候,可能都是不一样的
2.删除Map中的映射,并是使用entrySet 方法遍历输出
package com.collection; import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Scanner;
import java.util.Set; public class MapTest { /**
* @param args
*/ //用来承装学生类型的对象
public Map<String,Student> students; //构造器中初始化students数属性
public MapTest(){
students = new HashMap<String,Student>();
} /**
*测试添加:输入学生ID,判断是否被占用
*若未被占用,则输入学生姓名,创建学生对象,并且
*添加到students中
*/
public void testPut(){
Scanner console = new Scanner(System.in);
int i=0;
while(i<3){
System.out.println("请输入学生ID");
String ID = console.next();
//判断学生ID是否已经存在
Student st = students.get(ID);
if(st==null){
//提示输入学生姓名
System.out.println("请输入学生姓名");
String name = console.next();
//创建新的学生对象
Student newStudent = new Student(ID,name);
//通过调用students的put方法,添加ID-学生映射
students.put(ID, newStudent);
System.out.println("成功添加学生:"+students.get(ID).name);
i++;
}else{
System.out.println("该学生ID已被占用");
continue;
}
}
} //测试Map的keySet方法
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.id+"_"+st.name);
}
}
}
//测试删除map中的映射
public void testRemove(){ //从键盘中获得输入的ID
Scanner console = new Scanner(System.in); while(true){
//提示输入学生ID;
System.out.println("输入要删除学生的ID");
String ID = console.next();
Student st = students.get(ID);
if(st==null){
System.out.println("该学生ID不存在");
continue;
}
students.remove(ID);
System.out.println("成功删除学生:"+st.name);
break;
} } //通过entrySet方法遍历Map
public void testEntrySet(){
Set<Entry<String,Student>> entryset = students.entrySet();
for (Entry<String, Student> entry : entryset) {
System.out.println("删除后取得键:"+entry.getKey());
System.out.println("删除后取得键对应得值为"+entry.getValue().name); }
} public static void main(String[] args) {
// TODO 自动生成的方法存根
MapTest mt = new MapTest();
mt.testPut();
mt.testKeySet();
mt.testRemove();
mt.testEntrySet(); } }

3.修改Map中的映射
//利用put方法修改Map中的映射
public void testModify(){
System.out.println("请输入需要修改学生的ID");
Scanner console = new Scanner(System.in); while(true){
String stuID = console.next();
Student stu = students.get(stuID);
if(stu==null){
System.out.println("该ID不存在,请重新输入");
continue;
}
//提示输入修改前学生的姓名
System.out.println("原来的学生的姓名"+stu.name);
//提示输入新的学生的姓名
System.out.println("请输入新的学生姓名");
String name = console.next();
Student newStudent = new Student(stuID,name);
students.put(stuID, newStudent);
System.out.println("修改成功");
break; }
}
在mian方法中执行
public static void main(String[] args) {
// TODO 自动生成的方法存根
MapTest mt = new MapTest();
mt.testPut();
mt.testKeySet();
//mt.testRemove();
//mt.testEntrySet();
mt.testModify();
mt.testEntrySet();
}
集合框架(中):Map的更多相关文章
- Java集合框架中Map接口的使用
在我们常用的Java集合框架接口中,除了前面说过的Collection接口以及他的根接口List接口和Set接口的使用,Map接口也是一个经常使用的接口,和Collection接口不同,Map接口并不 ...
- 牛客网Java刷题知识点之Java 集合框架的构成、集合框架中的迭代器Iterator、集合框架中的集合接口Collection(List和Set)、集合框架中的Map集合
不多说,直接上干货! 集合框架中包含了大量集合接口.这些接口的实现类和操作它们的算法. 集合容器因为内部的数据结构不同,有多种具体容器. 不断的向上抽取,就形成了集合框架. Map是一次添加一对元素. ...
- 第19章 集合框架(3)-Map接口
第19章 集合框架(3)-Map接口 1.Map接口概述 Map是一种映射关系,那么什么是映射关系呢? 映射的数学解释 设A,B是两个非空集合,如果存在一个法则,使得对A中的每一个元素a,按法则f,在 ...
- 【JAVA集合框架之Map】
一.概述.1.Map是一种接口,在JAVA集合框架中是以一种非常重要的集合.2.Map一次添加一对元素,所以又称为“双列集合”(Collection一次添加一个元素,所以又称为“单列集合”)3.Map ...
- [黑马程序员] 集合框架2——Map系 & 集合工具类(Collections、Arrays)
---------------------- ASP.Net+Android+IO开发..Net培训.期待与您交流! ---------------------- 0. 集合框架按其所实现的接口, 大 ...
- Java集合框架之Map接口浅析
Java集合框架之Map接口浅析 一.Map接口综述: 1.1java.util.Map<k, v>简介 位于java.util包下的Map接口,是Java集合框架的重要成员,它是和Col ...
- Java集合框架之map
Java集合框架之map. Map的主要实现类有HashMap,LinkedHashMap,TreeMap,等等.具体可参阅API文档. 其中HashMap是无序排序. LinkedHashMap是自 ...
- 第49节:Java集合框架中底层文档的List与Set
Java集合框架中的List与Set // 简书作者:达叔小生 Collection -> Set 无序不重复 -> 无序HashSet,需要排序TreeSet -> List 有序 ...
- Java集合框架中的快速失败(fail—fast)机制
fail-fast机制,即快速失败机制,是java集合框架中的一种错误检测机制.多线程下用迭代器遍历一个集合对象时,如果遍历过程中对集合对象的内容进行了修改(增加.删除),则会抛出Concurre ...
- Java集合框架中底层文档的List与Set
Java集合框架中的List与Set // 简书作者:达叔小生 Collection -> Set 无序不重复 -> 无序HashSet,需要排序TreeSet -> List 有序 ...
随机推荐
- SQLSTATE[HY000] [2003] Can't connect to MySQL server on 'XXX' (13)
SQLSTATE[HY000] [2003] Can't connect to MySQL server on 'XXX' (13) 我可以真见识了 SELinux 的利害了, 这个问题让我找了好长时 ...
- c++知识点总结--new的一些用法
new operator 将对象产生与heap,不但分配内存而且为该对象调用一个constructor operator new只是分配内存,没有constructor被调用 有个一个特殊版本,称 ...
- JAVA并发-线程协作
这段时间有点忙,技术博客更新的比较少,今天更新一下相关并发的常用线程协作的类吧. ExecutorService 线程池,用于创造和复用线程,他有几种模式. 我举一个自定义线程池数量的例子如下 Exe ...
- SOA与WCF
背景: 高校平台马上就要进入编程阶段了,对于没怎么做过正式项目的我们来说,要学的东西实在太多了.一下子面对这么多学习资料时,我们也不能着急,还是踏踏实实,一个一个地去了解,其实他们都没那么神秘.这篇博 ...
- REST Web 服务(一)----REST 介绍
1. 什么是REST? REST 定义了一组体系架构原则,您可以根据这些原则设计以系统资源为中心的 Web 服务,包括使用不同语言编写的客户端如何通过 HTTP 处理和传输资源状态. 2. REST的 ...
- [bzoj4945][Noi2017]游戏
题目大意:有$n$个位置,有三种数,每个位置只可以填一种数,$d(d\leqslant8)$个位置有三种选择,其他位置只有两种选择.有一些限制,表示第$i$个位置选了某种数,那么第$j$个位置就只能选 ...
- 怎么用SecureCRT这个工具把linux服务器的压缩文件下载到本地的一个路径。
依次按上图中所示的突变,进入sftp的命令界面.输入help命令:即:sftp>help得到如下的截图. 比较重要的命令有:cd----查询服务器端的路径 lcd---查询本地的地址 pwd:服 ...
- android 跨进程通信
转自:http://www.androidsdn.com/article/show/137 由于android系统中应用程序之间不能共享内存.因此,在不同应用程序之间交互数据(跨进程通讯)就稍微麻烦一 ...
- shell面试经典70例
转载自:http://www.imooc.com/article/1131 1) 如何向脚本传递参数 ? ./script argument 例子: 显示文件名称脚本 ./show.sh file1. ...
- WebApi初探之路由配置
本文介绍了ASP.NET Web API路由HTTP请求控制器. 如果你熟悉ASP.NET MVC,Web API路由是和MVC路由非常相似的.主要差别是Web API使用HTTP方法而不是URI路径 ...