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类

  1. package com.collection;
  2.  
  3. import java.util.HashSet;
  4. import java.util.Set;
  5.  
  6. /**
  7. * @学生类
  8. *
  9. */
  10.  
  11. public class Student {
  12.  
  13. public String id;
  14. public String name;
  15. public Set<Course> courses;
  16. public Student(String id,String name)
  17. {
  18. this.id=id;
  19. this.name=name;
  20. this.courses=new HashSet<Course>();
  21. }
  22.  
  23. }

1.MapTest类

添加信息

  1. package com.collection;
  2.  
  3. import java.util.HashMap;
  4. import java.util.Map;
  5. import java.util.Scanner;
  6. import java.util.Set;
  7.  
  8. public class MapTest {
  9.  
  10. /**
  11. * @param args
  12. */
  13.  
  14. //用来承装学生类型的对象
  15. public Map<String,Student> students;
  16.  
  17. //构造器中初始化students数属性
  18. public MapTest(){
  19. students = new HashMap<String,Student>();
  20. }
  21.  
  22. /**
  23. *测试添加:输入学生ID,判断是否被占用
  24. *若未被占用,则输入学生姓名,创建学生对象,并且
  25. *添加到students中
  26. */
  27. public void testPut(){
  28. Scanner console = new Scanner(System.in);
  29. int i=0;
  30. while(i<3){
  31. System.out.println("请输入学生ID");
  32. String ID = console.next();
  33. //判断学生ID是否已经存在
  34. Student st = students.get(ID);
  35. if(st==null){
  36. //提示输入学生姓名
  37. System.out.println("请输入学生姓名");
  38. String name = console.next();
  39. //创建新的学生对象
  40. Student newStudent = new Student(ID,name);
  41. //通过调用students的put方法,添加ID-学生映射
  42. students.put(ID, newStudent);
  43. System.out.println("成功添加学生:"+students.get(ID).name);
  44. i++;
  45. }else{
  46. System.out.println("该学生ID已被占用");
  47. continue;
  48. }
  49. }
  50. }
  51.  
  52. //测试Map的keySet方法
  53. public void testKeySet(){
  54. //通过keySet方法,返回Map中所有“键”的Set集合
  55. Set<String> keyset = students.keySet();
  56. //取得students容量
  57. System.out.println("总共有:"+students.size()+"个学生");
  58. //遍历keyset取得每一个键,再调用get方法,得到每个键对应得value值
  59. for (String stuId : keyset) {
  60. Student st = students.get(stuId);
  61. if(st!=null){
  62. System.out.println("学生信息:"+st.id+"_"+st.name);
  63. }
  64. }
  65. }
  66.  
  67. public static void main(String[] args) {
  68. // TODO 自动生成的方法存根
  69. MapTest mt = new MapTest();
  70. mt.testPut();
  71. mt.testKeySet();
  72.  
  73. }
  74.  
  75. }

注:HashMap是无序的。所以每次运行显示学生信息的时候,可能都是不一样的

2.删除Map中的映射,并是使用entrySet 方法遍历输出

  1. package com.collection;
  2.  
  3. import java.util.HashMap;
  4. import java.util.Map;
  5. import java.util.Map.Entry;
  6. import java.util.Scanner;
  7. import java.util.Set;
  8.  
  9. public class MapTest {
  10.  
  11. /**
  12. * @param args
  13. */
  14.  
  15. //用来承装学生类型的对象
  16. public Map<String,Student> students;
  17.  
  18. //构造器中初始化students数属性
  19. public MapTest(){
  20. students = new HashMap<String,Student>();
  21. }
  22.  
  23. /**
  24. *测试添加:输入学生ID,判断是否被占用
  25. *若未被占用,则输入学生姓名,创建学生对象,并且
  26. *添加到students中
  27. */
  28. public void testPut(){
  29. Scanner console = new Scanner(System.in);
  30. int i=0;
  31. while(i<3){
  32. System.out.println("请输入学生ID");
  33. String ID = console.next();
  34. //判断学生ID是否已经存在
  35. Student st = students.get(ID);
  36. if(st==null){
  37. //提示输入学生姓名
  38. System.out.println("请输入学生姓名");
  39. String name = console.next();
  40. //创建新的学生对象
  41. Student newStudent = new Student(ID,name);
  42. //通过调用students的put方法,添加ID-学生映射
  43. students.put(ID, newStudent);
  44. System.out.println("成功添加学生:"+students.get(ID).name);
  45. i++;
  46. }else{
  47. System.out.println("该学生ID已被占用");
  48. continue;
  49. }
  50. }
  51. }
  52.  
  53. //测试Map的keySet方法
  54. public void testKeySet(){
  55. //通过keySet方法,返回Map中所有“键”的Set集合
  56. Set<String> keyset = students.keySet();
  57. //取得students容量
  58. System.out.println("总共有:"+students.size()+"个学生");
  59. //遍历keyset取得每一个键,再调用get方法,得到每个键对应得value值
  60. for (String stuId : keyset) {
  61. Student st = students.get(stuId);
  62. if(st!=null){
  63. System.out.println("学生信息:"+st.id+"_"+st.name);
  64. }
  65. }
  66. }
  67. //测试删除map中的映射
  68. public void testRemove(){
  69.  
  70. //从键盘中获得输入的ID
  71. Scanner console = new Scanner(System.in);
  72.  
  73. while(true){
  74. //提示输入学生ID;
  75. System.out.println("输入要删除学生的ID");
  76. String ID = console.next();
  77. Student st = students.get(ID);
  78. if(st==null){
  79. System.out.println("该学生ID不存在");
  80. continue;
  81. }
  82. students.remove(ID);
  83. System.out.println("成功删除学生:"+st.name);
  84. break;
  85. }
  86.  
  87. }
  88.  
  89. //通过entrySet方法遍历Map
  90. public void testEntrySet(){
  91. Set<Entry<String,Student>> entryset = students.entrySet();
  92. for (Entry<String, Student> entry : entryset) {
  93. System.out.println("删除后取得键:"+entry.getKey());
  94. System.out.println("删除后取得键对应得值为"+entry.getValue().name);
  95.  
  96. }
  97. }
  98.  
  99. public static void main(String[] args) {
  100. // TODO 自动生成的方法存根
  101. MapTest mt = new MapTest();
  102. mt.testPut();
  103. mt.testKeySet();
  104. mt.testRemove();
  105. mt.testEntrySet();
  106.  
  107. }
  108.  
  109. }

3.修改Map中的映射

  1. //利用put方法修改Map中的映射
  2. public void testModify(){
  3. System.out.println("请输入需要修改学生的ID");
  4. Scanner console = new Scanner(System.in);
  5.  
  6. while(true){
  7. String stuID = console.next();
  8. Student stu = students.get(stuID);
  9. if(stu==null){
  10. System.out.println("该ID不存在,请重新输入");
  11. continue;
  12. }
  13. //提示输入修改前学生的姓名
  14. System.out.println("原来的学生的姓名"+stu.name);
  15. //提示输入新的学生的姓名
  16. System.out.println("请输入新的学生姓名");
  17. String name = console.next();
  18. Student newStudent = new Student(stuID,name);
  19. students.put(stuID, newStudent);
  20. System.out.println("修改成功");
  21. break;
  22.  
  23. }
  24. }

在mian方法中执行

  1. public static void main(String[] args) {
  2. // TODO 自动生成的方法存根
  3. MapTest mt = new MapTest();
  4. mt.testPut();
  5. mt.testKeySet();
  6. //mt.testRemove();
  7. //mt.testEntrySet();
  8. mt.testModify();
  9. mt.testEntrySet();
  10.  
  11. }

集合框架(中):Map的更多相关文章

  1. Java集合框架中Map接口的使用

    在我们常用的Java集合框架接口中,除了前面说过的Collection接口以及他的根接口List接口和Set接口的使用,Map接口也是一个经常使用的接口,和Collection接口不同,Map接口并不 ...

  2. 牛客网Java刷题知识点之Java 集合框架的构成、集合框架中的迭代器Iterator、集合框架中的集合接口Collection(List和Set)、集合框架中的Map集合

    不多说,直接上干货! 集合框架中包含了大量集合接口.这些接口的实现类和操作它们的算法. 集合容器因为内部的数据结构不同,有多种具体容器. 不断的向上抽取,就形成了集合框架. Map是一次添加一对元素. ...

  3. 第19章 集合框架(3)-Map接口

    第19章 集合框架(3)-Map接口 1.Map接口概述 Map是一种映射关系,那么什么是映射关系呢? 映射的数学解释 设A,B是两个非空集合,如果存在一个法则,使得对A中的每一个元素a,按法则f,在 ...

  4. 【JAVA集合框架之Map】

    一.概述.1.Map是一种接口,在JAVA集合框架中是以一种非常重要的集合.2.Map一次添加一对元素,所以又称为“双列集合”(Collection一次添加一个元素,所以又称为“单列集合”)3.Map ...

  5. [黑马程序员] 集合框架2——Map系 & 集合工具类(Collections、Arrays)

    ---------------------- ASP.Net+Android+IO开发..Net培训.期待与您交流! ---------------------- 0. 集合框架按其所实现的接口, 大 ...

  6. Java集合框架之Map接口浅析

    Java集合框架之Map接口浅析 一.Map接口综述: 1.1java.util.Map<k, v>简介 位于java.util包下的Map接口,是Java集合框架的重要成员,它是和Col ...

  7. Java集合框架之map

    Java集合框架之map. Map的主要实现类有HashMap,LinkedHashMap,TreeMap,等等.具体可参阅API文档. 其中HashMap是无序排序. LinkedHashMap是自 ...

  8. 第49节:Java集合框架中底层文档的List与Set

    Java集合框架中的List与Set // 简书作者:达叔小生 Collection -> Set 无序不重复 -> 无序HashSet,需要排序TreeSet -> List 有序 ...

  9. Java集合框架中的快速失败(fail—fast)机制

      fail-fast机制,即快速失败机制,是java集合框架中的一种错误检测机制.多线程下用迭代器遍历一个集合对象时,如果遍历过程中对集合对象的内容进行了修改(增加.删除),则会抛出Concurre ...

  10. Java集合框架中底层文档的List与Set

    Java集合框架中的List与Set // 简书作者:达叔小生 Collection -> Set 无序不重复 -> 无序HashSet,需要排序TreeSet -> List 有序 ...

随机推荐

  1. PHP vscode+XDebug 远程断点调试服务器上的代码

    对于简单的项目或仅仅想知道某一位置的某个变量是什么值,直接使用var_dump配置exit来打印和中断就可以了,方便又快捷, 而对于大型项目的调试,或想了解某个系统的整个运行过程,xdebug可能会是 ...

  2. scrapy图片-爬取哈利波特壁纸

    话不多说,直接开始,直接放上整个程序过程 1.创建工程和生成spiders就不用说了,会用scrapy的都知道. 2.items.py class HarryItem(scrapy.Item): # ...

  3. HttpRuntime.Cache再学习

    摘抄: 可以看到:读缓存,其实是在调用Get方法,而写缓存则是在调用Insert方法的最简单的那个重载版本. 注意了:Add方法也可以将一个对象放入缓存,这个方法有7个参数,而Insert也有一个签名 ...

  4. Scala 基础(4)—— 类和对象

    1. 类.字段和方法 Scala 用 class 关键字定义类,一旦定义好一个类,就可以使用 new 关键字创建对象. Scala 使用 new 调用无参构造器时,可以不使用 (),推荐不使用括号: ...

  5. NativeScript Vue 和 Weex 对比与分析

    Weex Weex是一个项目,由阿里巴巴创造.它的口号是“一次编写,到处运行”,这意味着你可以使用完全相同的代码库构建网站(HTML5),Android和iOS的应用.目前有几个Weex的生产项目,在 ...

  6. [AGC011E] Increasing Numbers [数学]

    题面 传送门 思路 首先,我们观察一下上升数的性质 可以发现,它一定可以表示为最多9个全是1的数字的和 那么我们设$N$可以被表示成$k$个上升数的和,同时我们设$p_i=\underbrace{11 ...

  7. 强军如歌(strong)

    强军如歌(strong) 题目描述 给定一个NN个数的序列AA,如果序列AA不是非降序的,你需要在其中选择一个数删掉,不断重复这个操作直到序列AA非降.求有多少种不同的删数方案.注意:删掉的数的集合相 ...

  8. 转:LinkedHashMap使用(可以用来实现LRU缓存)

    1. LinkedHashMap概述: LinkedHashMap是HashMap的一个子类,它保留插入的顺序,如果需要输出的顺序和输入时的相同,那么就选用LinkedHashMap. LinkedH ...

  9. em,rem

    em rem 相对单位:  也可用于设置padding line-height等em相对当前容器的默认字体设置比如,所有浏览器默认字体都是16px,body{ font-size:62.5%}以后即1 ...

  10. 让Vs2010支持 Css3+HTML5

    第一步. 先到微软官方下载一个 Microsoft Visual Studio 2010 sp1 . 给传送门:.microsoft.com/downloads/zh-cn/details.aspx? ...