Map接口不是Collection接口的继承。而是从自己的用于维护键-值关联的接口层次结构入手。按定义,该接口描述了从不重复的键到值的映射。

我们可以把这个接口方法分成三组操作:改变、查询和提供可选视图。

改变操作允许您从映射中添加和除去键-值对。键和值都可以为null。但是,您不能把Map作为一个键或值添加给自身。
Object put(Object key,Object value):用来存放一个键-值对Map中
Object remove(Object key):根据key(键),移除一个键-值对,并将值返回
voidputAll(Map mapping) :将另外一个Map中的元素存入当前的Map中
void clear() :清空当前Map中的元素

查询操作允许您检查映射内容:

Object get(Object key) :根据key(键)取得对应的值
boolean containsKey(Object key) :判断Map中是否存在某键(key)
boolean containsValue(Object value):判断Map中是否存在某值(value)
int size():返回Map中键-值对的个数
boolean isEmpty() :判断当前Map是否为空
publicSet keySet() :返回所有的键(key),并使用Set容器存放
public Collection values() :返回所有的值(Value),并使用Collection存放
publicSet entrySet() :返回一个实现Map.Entry接口的元素Set

因为映射中键的集合必须是唯一的,就使用Set来支持。因为映射中值的集合可能不唯一,就使用Collection来支持。最后一个方法返回一个实现Map.Entry接口的元素Set。

我们看看Map的常用实现类的比较,如下表:

 

简述

实现

操作特性

成员要求

Map

保存键值对成员,基于键找值操作,使用compareTo或compare方法对键进行排序

HashMap

能满足用户对Map的通用需求

键成员可为任意Object子类的对象,但如果覆盖了equals方法,同时注意修改hashCode方法。

TreeMap

支持对键有序地遍历,使用时建议先用HashMap增加和删除成员,最后从HashMap生成TreeMap;附加实现了SortedMap接口,支持子Map等要求顺序的操作

键成员要求实现Comparable接口,或者使用Comparator构造TreeMap键成员一般为同一类型。

LinkedHashMap

保留键的插入顺序,用equals 方法检查键和值的相等性

成员可为任意Object子类的对象,但如果覆盖了equals方法,同时注意修改hashCode方法。


  1. import java.util.*;
  2.  
  3. publicclass MapTest {
  4.  
  5. publicstaticvoid main(String[] args) {
  6.  
  7. Map map1 = new HashMap();
  8.  
  9. Map map2 = new HashMap();
  10.  
  11. map1.put("1","aaa1");
  12.  
  13. map1.put("2","bbb2");
  14.  
  15. map2.put("10","aaaa10");
  16.  
  17. map2.put("11","bbbb11");
  18.  
  19. //根据键 "1" 取得值:"aaa1"
  20.  
  21. System.out.println("map1.get(\"1\")="+map1.get("1"));
  22.  
  23. // 根据键 "1" 移除键值对"1"-"aaa1"
  24.  
  25. System.out.println("map1.remove(\"1\")="+map1.remove("1"));
  26.  
  27. System.out.println("map1.get(\"1\")="+map1.get("1"));
  28.  
  29. map1.putAll(map2);//将map2全部元素放入map1中
  30.  
  31. map2.clear();//清空map2
  32.  
  33. System.out.println("map1 IsEmpty?="+map1.isEmpty());
  34.  
  35. System.out.println("map2 IsEmpty?="+map2.isEmpty());
  36.  
  37. System.out.println("map1 中的键值对的个数size = "+map1.size());
  38.  
  39. System.out.println("KeySet="+map1.keySet());//set
  40.  
  41. System.out.println("values="+map1.values());//Collection
  42.  
  43. System.out.println("entrySet="+map1.entrySet());
  44.  
  45. System.out.println("map1 是否包含键:11 = "+map1.containsKey("11"));
  46.  
  47. System.out.println("map1 是否包含值:aaa1 = "+map1.containsValue("aaa1"));
  48.  
  49. }
  50.  
  51. }
  52.  
  53. 运行输出结果为:
  54.  
  55. map1.get("1")=aaa1
  56.  
  57. map1.remove("1")=aaa1
  58.  
  59. map1.get("1")=null
  60.  
  61. map1 IsEmpty?=false
  62.  
  63. map2 IsEmpty?=true
  64.  
  65. map1 中的键值对的个数size = 3
  66.  
  67. KeySet=[10, 2, 11]
  68.  
  69. values=[aaaa10, bbb2, bbbb11]
  70.  
  71. entrySet=[10=aaaa10, 2=bbb2, 11=bbbb11]
  72.  
  73. map1 是否包含键:11 = true
  74.  
  75. map1 是否包含值:aaa1 = false
  76.  
  77. 在该例子中,我们创建一个HashMap,并使用了一下Map接口中的各个方法。
  78.  
  79. 其中Map中的entrySet()方法先提一下,该方法返回一个实现Map.Entry接口的对象集合。集合中每个对象都是底层Map中一个特定的键-值对。
  80.  
  81. Map.Entry 接口是Map 接口中的一个内部接口,该内部接口的实现类存放的是键值对。在下面的实现原理中,我们会对这方面再作介绍,现在我们先不管这个它的具体实现。
  82.  
  83. 我们再看看排序的Map是如何使用:
  84.  
  85. import java.util.*;
  86.  
  87. publicclass MapSortExample {
  88.  
  89. publicstaticvoid main(String args[]) {
  90.  
  91. Map map1 = new HashMap();
  92.  
  93. Map map2 = new LinkedHashMap();
  94.  
  95. for(int i=0;i<10;i++){
  96.  
  97. double s=Math.random()*100;//产生一个随机数,并将其放入Map中
  98.  
  99. map1.put(new Integer((int) s),"第 "+i+" 个放入的元素:"+s+"\n");
  100.  
  101. map2.put(new Integer((int) s),"第 "+i+" 个放入的元素:"+s+"\n");
  102.  
  103. }
  104.  
  105. System.out.println("未排序前HashMap:"+map1);
  106.  
  107. System.out.println("未排序前LinkedHashMap:"+map2);
  108.  
  109. //使用TreeMap来对另外的Map进行重构和排序
  110.  
  111. Map sortedMap = new TreeMap(map1);
  112.  
  113. System.out.println("排序后:"+sortedMap);
  114.  
  115. System.out.println("排序后:"+new TreeMap(map2));
  116.  
  117. }
  118.  
  119. }
  120.  
  121. 该程序的一次运行结果为:
  122.  
  123. 未排序前HashMap:{64=第 1 个放入的元素:64.05341725531845
  124.  
  125. , 15=第 9 个放入的元素:15.249165766266382
  126.  
  127. , 2=第 4 个放入的元素:2.66794706854534
  128.  
  129. , 77=第 0 个放入的元素:77.28814965781416
  130.  
  131. , 97=第 5 个放入的元素:97.32893518378948
  132.  
  133. , 99=第 2 个放入的元素:99.99412014935982
  134.  
  135. , 60=第 8 个放入的元素:60.91451419025399
  136.  
  137. , 6=第 3 个放入的元素:6.286974058646977
  138.  
  139. , 1=第 7 个放入的元素:1.8261658496439903
  140.  
  141. , 48=第 6 个放入的元素:48.736039522423106
  142.  
  143. }
  144.  
  145. 未排序前LinkedHashMap:{77=第 0 个放入的元素:77.28814965781416
  146.  
  147. , 64=第 1 个放入的元素:64.05341725531845
  148.  
  149. , 99=第 2 个放入的元素:99.99412014935982
  150.  
  151. , 6=第 3 个放入的元素:6.286974058646977
  152.  
  153. , 2=第 4 个放入的元素:2.66794706854534
  154.  
  155. , 97=第 5 个放入的元素:97.32893518378948
  156.  
  157. , 48=第 6 个放入的元素:48.736039522423106
  158.  
  159. , 1=第 7 个放入的元素:1.8261658496439903
  160.  
  161. , 60=第 8 个放入的元素:60.91451419025399
  162.  
  163. , 15=第 9 个放入的元素:15.249165766266382
  164.  
  165. }
  166.  
  167. 排序后:{1=第 7 个放入的元素:1.8261658496439903
  168.  
  169. , 2=第 4 个放入的元素:2.66794706854534
  170.  
  171. , 6=第 3 个放入的元素:6.286974058646977
  172.  
  173. , 15=第 9 个放入的元素:15.249165766266382
  174.  
  175. , 48=第 6 个放入的元素:48.736039522423106
  176.  
  177. , 60=第 8 个放入的元素:60.91451419025399
  178.  
  179. , 64=第 1 个放入的元素:64.05341725531845
  180.  
  181. , 77=第 0 个放入的元素:77.28814965781416
  182.  
  183. , 97=第 5 个放入的元素:97.32893518378948
  184.  
  185. , 99=第 2 个放入的元素:99.99412014935982
  186.  
  187. }
  188.  
  189. 排序后:{1=第 7 个放入的元素:1.8261658496439903
  190.  
  191. , 2=第 4 个放入的元素:2.66794706854534
  192.  
  193. , 6=第 3 个放入的元素:6.286974058646977
  194.  
  195. , 15=第 9 个放入的元素:15.249165766266382
  196.  
  197. , 48=第 6 个放入的元素:48.736039522423106
  198.  
  199. , 60=第 8 个放入的元素:60.91451419025399
  200.  
  201. , 64=第 1 个放入的元素:64.05341725531845
  202.  
  203. , 77=第 0 个放入的元素:77.28814965781416
  204.  
  205. , 97=第 5 个放入的元素:97.32893518378948
  206.  
  207. , 99=第 2 个放入的元素:99.99412014935982
  208.  
  209. }
  210.  
  211. 从运行结果,我们可以看出,HashMap的存入顺序和输出顺序无关。而LinkedHashMap则保留了键值对的存入顺序。TreeMap则是对Map中的元素进行排序。在实际的使用中我们也经常这样做:使用HashMap或者LinkedHashMap来存放元素,当所有的元素都存放完成后,如果使用则是需要一个经过排序的Map的话,我们再使用TreeMap来重构原来的Map对象。这样做的好处是:因为HashMapLinkedHashMap存储数据的速度比直接使用TreeMap 要快,存取效率要高。当完成了所有的元素的存放后,我们再对整个的Map中的元素进行排序。这样可以提高整个程序的运行的效率,缩短执行时间。
  212.  
  213. 这里需要注意的是,TreeMap中是根据键(Key)进行排序的。而如果我们要使用TreeMap来进行正常的排序的话,Key 中存放的对象必须实现Comparable 接口。

Java的集合类之 map 接口用法的更多相关文章

  1. Java的集合类之 List 接口用法

    集合其实在本质上面就是数据结构,它封装了一些底层的数据结构等操作进行操作. 集合的长度是可变的,用来存放对象的引用.常见的集合类有List集合.Set集合.Map集合. 1. List接口 List是 ...

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

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

  3. java的集合类【Map(映射)、List(列表)与Set(集)比较】

    https://baike.baidu.com/item/java%E9%9B%86%E5%90%88%E7%B1%BB/4758922?fr=aladdin https://www.cnblogs. ...

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

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

  5. Java集合中的Map接口

    jdk1.8.0_144 Map是Java三种集合中的一种位于java.util包中,Map作为一个接口存在定义了这种数据结构的一些基础操作,它的最终实现类有很多:HashMap.TreeMap.So ...

  6. Java:集合,Map接口框架图

    Java集合大致可分为Set.List和Map三种体系,其中Set代表无序.不可重复的集合:List代表有序.重复的集合:而Map则代表具有映射关系的集合.Java 5之后,增加了Queue体系集合, ...

  7. Java集合中的Map接口怎么使用?

    Map(双列集合框架) 1.Map接口及实现类概述 Map 接口提供三种collection 视图,允许以键集.值集或键-值映射关系集的形式查看某个映射的内容.映射顺序 定义为迭代器在映射的 coll ...

  8. Java集合——集合框架Map接口

    1.Map接口 public interface Map<K,V>将键映射到值的对象.一个映射不能包含重复的键:每个键最多只能映射到一个值.  2.HashMap.Hashtable.Tr ...

  9. 【Java】Collection与Map接口总结

    Collection     -----List                -----LinkedList    非同步                 ----ArrayList      非同 ...

随机推荐

  1. 全部文章> Maven

    Maven     原 Maven中<resources>标签详解 &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;& ...

  2. 新款戴尔笔记本win10系统改win7 安装教程

    下载U盘启动制作工具 及戴尔DELL ghost win7 旗舰版GHO 文件 下载地址:http://pan.baidu.com/s/1c17JqpU  插入制作好的U盘启动盘,开机按F2进入BIO ...

  3. 在spring boot里使用undertow而非tomcat

    参考https://examples.javacodegeeks.com/enterprise-java/spring/tomcat-vs-jetty-vs-undertow-comparison-o ...

  4. Jmeter(四十七)_性能测试统计超时率

    概述 今天做一个性能测试的案例.需求中给出并发人数和业务时间段.根据2,5,8原则,统计响应超时率 实际场景 1:登录--考勤打卡--退出 2:并发人数200人,业务持续时间5分钟 3:要求登录响应时 ...

  5. 【Gamma】设计与计划

    目录 需求分析 已实现 功能 用户使用动机分析 当前阶段推广困难 当前阶段任务优先级 主要功能解析 社团活动场地申请 - 实现成本较高,正在调研社长的需求 完善入社流程的信息提示 通知功能 通知管理 ...

  6. 剑指offer:数据流中的中位数

    题目描述: 如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值.如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值.我 ...

  7. React 版本16.9.0 中配置路由以及路由传参

    我的脚手架版本如下: "dependencies": { "antd": "^3.21.4", "jquery": &q ...

  8. Three.js 快速上手以及在 React 中运用[转]

    https://juejin.im/post/5ca22692f265da30a53d6656 github 的地址 欢迎 star! 之前项目中用到了 3D 模型演示的问题,整理了一下之前学习总结以 ...

  9. mysql注入写文件

    select * from admin where id =-1 union select 1,'<?php phpinfo();?>',3,4 into outfile 'c:\\1.p ...

  10. win10 安装mysql 8.0.18 解决Navicat初次连接报错

    win10 安装mysql 8.0.18 解决Navicat初次连接报错 win10 安装mysql 8.0.18-winx64 一,先去官网下载mysql 安装包 https://dev.mysql ...