Map

1.4.1        概述

数学中的映射关系在Java中就是通过Map来实现的。它表示,里面存储的元素是一个对(pair),我们通过一个对象,可以在这个映射关系中找到另外一个和这个对象相关的东西。

前面提到的我们对于根据帐号名得到对应的人员的信息,就属于这种情况的应用。我们讲一个人员的帐户名和这人员的信息作了一个映射关系,也就是说,我们把帐户名和人员信息当成了一个“键值对”,“键”就是帐户名,“值”就是人员信息。下面我们先看看Map 接口的常用方法。

1.4.2         常用方法

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

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

改变操作允许您从映射中添加和除去键-值对。键和值都可以为 null。但是,您不能把 Map 作为一个键或值添加给自身。

       Object put(Object key,Object value):用来存放一个键-值对Map

       Object remove(Object key):根据key(),移除一个键-值对,并将值返回

       void putAll(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是否为空

最后一组方法允许您把键或值的组作为集合来处理。

       public Set keySet() :返回所有的键(key),并使用Set容器存放

       public Collection values() :返回所有的值(Value),并使用Collection存放

       public Set entrySet() 返回一个实现 Map.Entry 接口的元素 Set

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

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

 

简述

实现

操作特性

成员要求

Map

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

HashMap

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

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

TreeMap

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

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

LinkedHashMap

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

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

下面我们看一个简单的例子:

import java.util.*; 

public class MapTest {

public static void main(String[] args) {

      Map map1 = new HashMap();

      Map map2 = new HashMap();

      map1.put("1","aaa1");

      map1.put("2","bbb2");

      map2.put("10","aaaa10");

      map2.put("11","bbbb11");

//根据键 "1" 取得值:"aaa1"

      System.out.println("map1.get(\"1\")="+map1.get("1"));

// 根据键 "1" 移除键值对"1"-"aaa1"

      System.out.println("map1.remove(\"1\")="+map1.remove("1"));  

      System.out.println("map1.get(\"1\")="+map1.get("1"));

      map1.putAll(map2);//将map2全部元素放入map1中

      map2.clear();//清空map2

      System.out.println("map1 IsEmpty?="+map1.isEmpty());

      System.out.println("map2 IsEmpty?="+map2.isEmpty());

      System.out.println("map1 中的键值对的个数size = "+map1.size());

      System.out.println("KeySet="+map1.keySet());//set

      System.out.println("values="+map1.values());//Collection

      System.out.println("entrySet="+map1.entrySet());    

      System.out.println("map1 是否包含键:11 = "+map1.containsKey("11"));  

      System.out.println("map1 是否包含值:aaa1 = "+map1.containsValue("aaa1"));

   }

}

运行输出结果为:

map1.get("1")=aaa1

map1.remove("1")=aaa1

map1.get("1")=null

map1 IsEmpty?=false

map2 IsEmpty?=true

map1 中的键值对的个数size = 3

KeySet=[10, 2, 11]

values=[aaaa10, bbb2, bbbb11]

entrySet=[10=aaaa10, 2=bbb2, 11=bbbb11]

map1 是否包含键:11 = true

map1 是否包含值:aaa1 = false

在该例子中,我们创建一个HashMap,并使用了一下Map接口中的各个方法。

其中Map中的entrySet()方法先提一下,该方法返回一个实现 Map.Entry 接口的对象集合。集合中每个对象都是底层 Map 中一个特定的键-值对。

Map.Entry 接口是Map 接口中的一个内部接口,该内部接口的实现类存放的是键值对。在下面的实现原理中,我们会对这方面再作介绍,现在我们先不管这个它的具体实现。

我们再看看排序的Map是如何使用:

import java.util.*;

public class MapSortExample {

  public static void main(String args[]) {

    Map map1 = new HashMap();

    Map map2 = new LinkedHashMap();

    for(int i=0;i<10;i++){

      double s=Math.random()*100;//产生一个随机数,并将其放入Map中

       map1.put(new Integer((int) s),"第 "+i+" 个放入的元素:"+s+"\n");

       map2.put(new Integer((int) s),"第 "+i+" 个放入的元素:"+s+"\n");

    }

    System.out.println("未排序前HashMap:"+map1);

    System.out.println("未排序前LinkedHashMap:"+map2);

    //使用TreeMap来对另外的Map进行重构和排序

    Map sortedMap = new TreeMap(map1);

    System.out.println("排序后:"+sortedMap);

    System.out.println("排序后:"+new TreeMap(map2));

  }

}

该程序的一次运行结果为:

未排序前HashMap:{64=第 1 个放入的元素:64.05341725531845

, 15=第 9 个放入的元素:15.249165766266382

, 2=第 4 个放入的元素:2.66794706854534

, 77=第 0 个放入的元素:77.28814965781416

, 97=第 5 个放入的元素:97.32893518378948

, 99=第 2 个放入的元素:99.99412014935982

, 60=第 8 个放入的元素:60.91451419025399

, 6=第 3 个放入的元素:6.286974058646977

, 1=第 7 个放入的元素:1.8261658496439903

, 48=第 6 个放入的元素:48.736039522423106

}

未排序前LinkedHashMap:{77=第 0 个放入的元素:77.28814965781416

, 64=第 1 个放入的元素:64.05341725531845

, 99=第 2 个放入的元素:99.99412014935982

, 6=第 3 个放入的元素:6.286974058646977

, 2=第 4 个放入的元素:2.66794706854534

, 97=第 5 个放入的元素:97.32893518378948

, 48=第 6 个放入的元素:48.736039522423106

, 1=第 7 个放入的元素:1.8261658496439903

, 60=第 8 个放入的元素:60.91451419025399

, 15=第 9 个放入的元素:15.249165766266382

}

排序后:{1=第 7 个放入的元素:1.8261658496439903

, 2=第 4 个放入的元素:2.66794706854534

, 6=第 3 个放入的元素:6.286974058646977

, 15=第 9 个放入的元素:15.249165766266382

, 48=第 6 个放入的元素:48.736039522423106

, 60=第 8 个放入的元素:60.91451419025399

, 64=第 1 个放入的元素:64.05341725531845

, 77=第 0 个放入的元素:77.28814965781416

, 97=第 5 个放入的元素:97.32893518378948

, 99=第 2 个放入的元素:99.99412014935982

}

排序后:{1=第 7 个放入的元素:1.8261658496439903

, 2=第 4 个放入的元素:2.66794706854534

, 6=第 3 个放入的元素:6.286974058646977

, 15=第 9 个放入的元素:15.249165766266382

, 48=第 6 个放入的元素:48.736039522423106

, 60=第 8 个放入的元素:60.91451419025399

, 64=第 1 个放入的元素:64.05341725531845

, 77=第 0 个放入的元素:77.28814965781416

, 97=第 5 个放入的元素:97.32893518378948

, 99=第 2 个放入的元素:99.99412014935982

}

从运行结果,我们可以看出,HashMap的存入顺序和输出顺序无关。而LinkedHashMap 则保留了键值对的存入顺序。TreeMap则是对Map中的元素进行排序。在实际的使用中我们也经常这样做:使用HashMap或者LinkedHashMap 来存放元素,当所有的元素都存放完成后,如果使用则是需要一个经过排序的Map的话,我们再使用TreeMap来重构原来的Map对象。这样做的好处是:因为HashMap和LinkedHashMap 存储数据的速度比直接使用TreeMap 要快,存取效率要高。当完成了所有的元素的存放后,我们再对整个的Map中的元素进行排序。这样可以提高整个程序的运行的效率,缩短执行时间。

这里需要注意的是,TreeMap中是根据键(Key)进行排序的。而如果我们要使用TreeMap来进行正常的排序的话,Key 中存放的对象必须实现Comparable 接口。

J2SE知识点摘记(二十二)的更多相关文章

  1. JAVA之旅(二十二)——Map概述,子类对象特点,共性方法,keySet,entrySet,Map小练习

    JAVA之旅(二十二)--Map概述,子类对象特点,共性方法,keySet,entrySet,Map小练习 继续坚持下去吧,各位骚年们! 事实上,我们的数据结构,只剩下这个Map的知识点了,平时开发中 ...

  2. JAVA基础知识总结:一到二十二全部总结

    >一: 一.软件开发的常识 1.什么是软件? 一系列按照特定顺序组织起来的计算机数据或者指令 常见的软件: 系统软件:Windows\Mac OS \Linux 应用软件:QQ,一系列的播放器( ...

  3. [分享] IT天空的二十二条军规

    Una 发表于 2014-9-19 20:25:06 https://www.itsk.com/thread-335975-1-1.html IT天空的二十二条军规 第一条.你不是什么都会,也不是什么 ...

  4. Bootstrap <基础二十二>超大屏幕(Jumbotron)

    Bootstrap 支持的另一个特性,超大屏幕(Jumbotron).顾名思义该组件可以增加标题的大小,并为登陆页面内容添加更多的外边距(margin).使用超大屏幕(Jumbotron)的步骤如下: ...

  5. Web 前端开发精华文章推荐(HTML5、CSS3、jQuery)【系列二十二】

    <Web 前端开发精华文章推荐>2014年第一期(总第二十二期)和大家见面了.梦想天空博客关注 前端开发 技术,分享各类能够提升网站用户体验的优秀 jQuery 插件,展示前沿的 HTML ...

  6. 二十二、OGNL的一些其他操作

    二十二.OGNL的一些其他操作 投影 ?判断满足条件 动作类代码: ^ $   public class Demo2Action extends ActionSupport {     public ...

  7. WCF技术剖析之二十二: 深入剖析WCF底层异常处理框架实现原理[中篇]

    原文:WCF技术剖析之二十二: 深入剖析WCF底层异常处理框架实现原理[中篇] 在[上篇]中,我们分别站在消息交换和编程的角度介绍了SOAP Fault和FaultException异常.在服务执行过 ...

  8. VMware vSphere 服务器虚拟化之二十二桌面虚拟化之创建View Composer链接克隆的虚拟桌面池

    VMware vSphere 服务器虚拟化之二十二桌面虚拟化之创建View Composer链接克隆的虚拟桌面池 在上一节我们创建了完整克隆的自动专有桌面池,在创建过程比较缓慢,这次我们将学习创建Vi ...

  9. Bootstrap入门(二十二)组件16:列表组

    Bootstrap入门(二十二)组件16:列表组 列表组是灵活又强大的组件,不仅能用于显示一组简单的元素,还能用于复杂的定制的内容. 1.默认样式列表组 2.加入徽章 3.链接 4.禁用的列表组 5. ...

  10. 备忘录模式 Memento 快照模式 标记Token模式 行为型 设计模式(二十二)

    备忘录模式 Memento   沿着脚印,走过你来时的路,回到原点.     苦海翻起爱恨   在世间难逃避命运   相亲竟不可接近   或我应该相信是缘份   一首<一生所爱>触动了多少 ...

随机推荐

  1. openstack外篇之认识mysql授权及一些操作

    openstack外篇之认识mysql授权及一些操作  http://www.aboutyun.com/thread-11405-1-1.html

  2. word2vec配置到使用

    (1)首先下载word2vec,地址:https://code.google.com/p/word2vec/,可能下载的时候有问题,google上不去,那么可以从csdn上面下载. 解压后目录如下: ...

  3. jquery easyUI DataGrid 初始化的时候就显示可排序的字段

    在使用easy ui的列表中,想要标记可以排序的字段,使用户一看页面就知道哪些是可以点击排序的. 给可排序的字段添加 图标在列名后面.不可排序的字段还和原来一样. 步骤: 你需要一个图标 , 你需要给 ...

  4. html5 Canvas处理图像 实例讲解

    最近在学习canvas,canvas有很强大的图像处理功能,下面写一个我的学习总结: canvas常用功能: 1. 绘制矩形.圆形.曲线.组合图形 2. 绘制文本 3.绘制渐变.变形的图形 4. 图片 ...

  5. jquery 实现横向滑动自动切换源码(同时显示多张图片)

    html代码: <!doctype html> <html lang="en"> <head> <meta charset="U ...

  6. python---连接MySQL第二页

    用python向MySQL插入值.并取出被插入行的主键. #!/usr/bin/python #!coding:utf-8 import mysql.connector from mysql.conn ...

  7. 如何使用for循环连续的实例化多个对象!

    Test类import java.util.ArrayList; import java.util.List; import java.util.Scanner; public class Test ...

  8. android apk 导出(签名) is not translated in xx 代码混淆 反编译

    apk导出遇到问题 解决方式如下 1.导出步骤第一步 2.提示错误 3.解决 其余步骤参见: 代码混淆和数字签名(现在版本混淆) http://blog.csdn.net/moruna/article ...

  9. 同步Flex Chart的数据提示

    原文 http://www.riafan.com/sync-datatips-for-flex-chart/ 图表数据提示的同步不仅包含单个图表内多个系列的数据提示的同步,也包含多个图表的数据提示的同 ...

  10. [Leetcode][Python]39: Combination Sum

    # -*- coding: utf8 -*-'''__author__ = 'dabay.wang@gmail.com' 39: Combination Sumhttps://oj.leetcode. ...