Map以按键/数值对的形式存储数据,和数组很类似,在数组中存在的索引,它们本身也是对象。

Map的接口

Map---实现Map

Map.Entry--Map的内部类,描写叙述Map中的按键/数值对。

SortedMap---扩展Map,使按键保持升序排列

关于怎么使用,通常是选择Map的子类,而不直接用Map类。

以下以HashMap为例。

public     static     void     main(String     args[])

{

HashMap     hashmap     =     new     HashMap();

hashmap.put("Item0",     "Value0");

hashmap.put("Item1",     "Value1");

hashmap.put("Item2",     "Value2");

hashmap.put("Item3",     "Value3");

Set     set     =     hashmap.entrySet();

Iterator     iterator     =     set.iterator();

while     (iterator.hasNext()

{

Map.Entry     mapentry     =     (Map.Entry)     iterator.next();

System.out.println(mapentry.getkey()     +     "/"     +     mapentry.getValue());

}

}

注意,这里Map的按键必须是唯一的,比方说不能有两个按键都为null。

假设用过它,就会知道它的用处了。

又比方:

Map map = new HashMap();

map.put("Order", (Order) obj);

资料:

Collection容器中包括Set和List接口,Set中又包括HashSet,List中包括LinkedList和ArrayList;单独的Map接口中仅仅有HashMap。

java.util 中的集合类包括 Java 中某些最经常使用的类。 最经常使用的集合类是 List 和 Map。 List 的详细实现包括 ArrayList 和 Vector,它们是可变大小的列表,比較适合构建、存储和操作不论什么类型对象的元素列表。 List 适用于按数值索引訪问元素的情形,当中的数据有顺序且能够反复。而Set中数据无顺序且不能够反复。

Map 提供了一个更通用的元素存储方法。 Map 集合类用于存储元素对(称作“键”和“值”),当中每一个键映射到一个值。 从概念上而言,您能够将 List 看作是具有数值键的 Map。 而实际上,除了 List 和 Map 都在定义 java.util 中外,两者并没有直接的联系。本文将着重介绍核心 Java 发行套件中附带的 Map,同一时候还将介绍怎样採用或实现更适用于您应用程序特定数据的专用 Map。

了解 Map 接口和方法

Java 核心类中有非常多提前定义的 Map 类。 在介绍详细实现之前,我们先介绍一下 Map 接口本身,以便了解全部实现的共同点。 Map 接口定义了四种类型的方法,每一个 Map 都包括这些方法。 以下,我们从两个普通的方法(表 1)開始对这些方法加以介绍。

表 1: 覆盖的方法。 我们将这 Object 的这两个方法覆盖,以正确比較 Map 对象的等价性。equals(Object o)

比較指定对象与此 Map 的等价性

hashCode()

返回此 Map 的哈希码

Map 构建

Map 定义了几个用于插入和删除元素的变换方法(表 2)。

表 2: Map 更新方法: 能够更改 Map 内容。clear()

从 Map 中删除全部映射

remove(Object key)

从 Map 中删除键和关联的值

put(Object key, Object value)

将指定值与指定键相关联

clear()

从 Map 中删除全部映射

putAll(Map t)

将指定 Map 中的全部映射拷贝到此 map

虽然您可能注意到,纵然如果忽略构建一个须要传递给 putAll() 的 Map 的开销,使用 putAll() 通常也并不比使用大量的 put() 调用更有效率,但 putAll() 的存在一点也不稀奇。 这是由于,putAll() 除了迭代 put() 所运行的将每一个键值对加入到 Map 的算法以外,还须要迭代所传递的 Map 的元素。 但应注意,putAll() 在加入全部元素之前能够正确调整 Map 的大小,因此如果您未亲自调整 Map 的大小(我们将对此进行简介),则 putAll() 可能比预期的更有效。

查看 Map

迭代 Map 中的元素不存在直接了当的方法。 假设要查询某个 Map 以了解其哪些元素满足特定查询,或假设要迭代其全部元素(不管原因怎样),则您首先须要获取该 Map 的“视图”。 有三种可能的视图(參见表 3)

全部键值对 — 參见 entrySet()

全部键 — 參见 keySet()

全部值 — 參见 values()

前两个视图均返回 Set 对象,第三个视图返回 Collection 对象。 就这两种情况而言,问题到这里并没有结束,这是由于您无法直接迭代 Collection 对象或 Set 对象。要进行迭代,您必须获得一个 Iterator 对象。 因此,要迭代 Map 的元素,必须进行比較烦琐的编码

Iterator keyValuePairs = aMap.entrySet().iterator();Iterator keys = aMap.keySet().iterator();Iterator values = aMap.values().iterator();

值 得注意的是,这些对象(Set、Collection 和 Iterator)实际上是基础 Map 的视图,而不是包括全部元素的副本。 这使它们的使用效率非常高。 还有一方面,Collection 或 Set 对象的 toArray() 方法却创建包括 Map 全部元素的数组对象,因此除了确实须要使用数组中元素的情形外,其效率并不高。

我执行了一个小測试(随附文件里的 Test1),该測试使用了 HashMap,并使用下面两种方法对迭代 Map 元素的开销进行了比較:

int mapsize = aMap.size();Iterator keyValuePairs1 = aMap.entrySet().iterator();for (int i = 0; i < mapsize; i++){   Map.Entry entry = (Map.Entry) keyValuePairs1.next();   Object key = entry.getKey();   Object value = entry.getValue();   ...}Object[] keyValuePairs2 = aMap.entrySet().toArray();for (int i = 0; i < rem; i++) {{   Map.Entry entry = (Map.Entry) keyValuePairs2[i];   Object key = entry.getKey();Profilers in Oracle JDeveloper

Oracle JDeveloper 包括一个嵌入的监測器,它測量内存和运行时间,使您可以高速识别代码中的瓶颈。 我曾使用 Jdeveloper 的运行监測器监測 HashMap 的 containsKey() 和 containsValue() 方法,并不是常快发现 containsKey() 方法的速度比 containsValue() 方法慢非常多(实际上要慢几个数量级!)。 (參见图 1 和图 2,以及随附文件里的 Test2 类)。   Object value = entry.getValue();   ...}

此 測试使用了两种測量方法: 一种是測量迭代元素的时间,还有一种測量使用 toArray 调用创建数组的其它开销。 第一种方法(忽略创建数组所需的时间)表明,使用已从 toArray 调用中创建的数组迭代元素的速度要比使用 Iterator 的速度大约快 30%-60%。 但假设将使用 toArray 方法创建数组的开销包括在内,则使用 Iterator 实际上要快 10%-20%。 因此,假设因为某种原因要创建一个集合元素的数组而非迭代这些元素,则应使用该数组迭代元素。 但假设您不须要此中间数组,则不要创建它,而是使用 Iterator 迭代元素。

表 3: 返回视图的 Map 方法: 使用这些方法返回的对象,您能够遍历 Map 的元素,还能够删除 Map 中的元素。entrySet()

返回 Map 中所包括映射的 Set 视图。 Set 中的每一个元素都是一个 Map.Entry 对象,能够使用 getKey() 和 getValue() 方法(另一个 setValue() 方法)訪问后者的键元素和值元素

keySet()

返回 Map 中所包括键的 Set 视图。 删除 Set 中的元素还将删除 Map 中对应的映射(键和值)

values()

返回 map 中所包括值的 Collection 视图。 删除 Collection 中的元素还将删除 Map 中对应的映射(键和值)

訪问元素

表 4 中列出了 Map 訪问方法。Map 通常适合按键(而非按值)进行訪问。 Map 定义中没有规定这肯定是真的,但通常您能够期望这是真的。 比如,您能够期望 containsKey() 方法与 get() 方法一样快。 还有一方面,containsValue() 方法非常可能须要扫描 Map 中的值,因此它的速度可能比較慢。

表 4: Map 訪问和測试方法: 这些方法检索有关 Map 内容的信息但不更改 Map 内容。get(Object key)

返回与指定键关联的值

containsKey(Object key)

假设 Map 包括指定键的映射,则返回 true

containsValue(Object value)

假设此 Map 将一个或多个键映射到指定值,则返回 true

isEmpty()

假设 Map 不包括键-值映射,则返回 true

size()

返回 Map 中的键-值映射的数目

对使用 containsKey() 和 containsValue() 遍历 HashMap 中全部元素所需时间的測试表明,containsValue() 所需的时间要长非常多。 实际上要长几个数量级! (參见图 1 和图 2,以及随附文件里的 Test2)。 因此,假设 containsValue() 是应用程序中的性能问题,它将非常快显现出来,并可以通过监測您的应用程序轻松地将其识别。 这样的情况下,我相信您可以想出一个有效的替换方法来实现 containsValue() 提供的等效功能。 但假设想不出办法,则一个可行的解决方式是再创建一个 Map,并将第一个 Map 的全部值作为键。 这样,第一个 Map 上的 containsValue() 将成为第二个 Map 上更有效的 containsKey()。

使用java做地图_在地图中使用Java相关推荐

  1. java coin介绍_代码示例中的Java 7:Project Coin

    java coin介绍 该博客通过代码示例介绍了一些新的Java 7功能,这些项目在Project Coin一词下进行了概述. Project Coin的目标是向JDK 7添加一组小的语言更改.这些更 ...

  2. oracle java赋予执行_在oracle中执行java例程

    oracle10g的oralceJVM支撑java1.4. 这让我们能用java做一些ps/sql不容易处理的任务,比如访问http资源等.这篇文章写个实例.首先创建java源码,所有method必须 ...

  3. 数据库怎么用Java做封面_在PPT中制作高逼格封面怎样操作?一招教你轻松解决...

    现在的封面设计感都很特别,设计工具除了使用ps工具之外还可以使用PPT进行操作.相信很多朋友都会很好奇.PPT就是用来做一些幻灯片的什么时候有这些操作呢?下面为了验证小编没有说谎为大家展示一下在PPT ...

  4. mac java偏好设置_在 Mac中配置Java开发环境

    最近买了一台mac pro,晚上在家写java,在配置环境的时候碰到很多问题,现在总结出来,提供给大家. 1.配置Tomcat 1.下载: 从apache官网(http://tomcat.apache ...

  5. 百度离线地图_这个地图APP,专注于地图软件该做的事!

    Bmap Bmap,简单的双地图应用.可任意切换/高德地图数据源,致力满足日常生活的出行需求.具有步行.公交.骑行.驾驶等出行方案,查看街景. 新版特性 1.升级百度地图sdk6.0.0 2.升级高德 ...

  6. 高精地图_语义地图_众包地图相关论文笔记

    1.20220618_LT-mapper: A Modular Framework for LiDAR-based Lifelong Mapping 2021 3d-Lidar构建long-term地 ...

  7. react 谷歌地图_谷歌地图与React

    react 谷歌地图 情况(The Situation) Your working on a React-based application and you want to implement Goo ...

  8. ubuntu java classpath 设置_在Ubuntu中正确设置java classpath和java_home

    我有错误 Exception in thread"main" java.lang.NoClassDefFoundError: 当我尝试在Ubuntu上运行编译类时.我使用的是一个非 ...

  9. java lua脚本_请问该如何在Java中使用Lua脚本语言?

    如何在Java中使用Lua脚本语言是本文要介绍的内容,主要是来学习LUA脚本语言在JAVA中如何来使用,Lua就不说了, 现在比较热门, 语法也很简单. 为了在Java中调用, 折腾了比较长的时间, ...

  10. 怎么用java做日历_怎么用java做日历?实例讲解

    Java是一种高级语言,可以用到很多领域中,这不,用java还可以做日历,那么怎么用java做日历?今天我们就给大家讲解一下用java做日历的方法,学会大家也可以做一个日历出来! 我们需要用到两个类: ...

最新文章

  1. Cocos2dx小技巧 单例
  2. 64 位系统遇到未在本地计算机上注册 Microsoft.Jet.OLEDB.4.0
  3. 初探linux内核编程,参数传递以及模块间函数调用
  4. 5种设置ASP.NET Core应用程序URL的方法
  5. 抓狐狸python_​用Python操作Kubernetes的Job
  6. linux安装mysql后如何连接_Linux安装mysql后开启远程连接(记录相关命令)
  7. xrdp出现雪花屏,闪退怎么办?
  8. 状态码为200 java 类
  9. xmind 软件画思维导图
  10. matlab仿真之大尺度衰落因子2--小区间
  11. python chardet模块_使用Python chardet模块解决中文乱码问题
  12. 尚有缺者,方为完美。小人求全,智者求阙——《致温弟沅弟》曾国藩
  13. AppScan--图解web扫描工具IBM Security AppScan Standard
  14. Java类型转换笔记
  15. 服务器的GPU显示err,Nvidia GPU风扇和电源显示ERR!
  16. 阿里云ECS学生成长计划续费资格考试
  17. 我不愿当一辈子啃老族
  18. Stata实验——关于我国GDP增长率和CONS增长率
  19. 3.15antdesign中table的应用
  20. 国外常用的免费DNS域名解析服务器(转)

热门文章

  1. 高级计算机程序员实操题,国家计算机软考高级程序员历年真题1990.doc
  2. 工地人员定位管理系统,如何有效做到安全生产双预防?
  3. 模板匹配人眼---OpenCV-Python开发指南(33)
  4. 【黑金原创教程】【FPGA那些事儿-驱动篇I 】实验二十四:SD卡模块
  5. 如何用MATLAB编写FIR维纳滤波器,FIR维纳滤波器的Matlab仿真验证.ppt
  6. Intellij IDEA之Mybatis插件:Free Mybatis Plugin
  7. 蓝桥杯嵌入式备赛手册
  8. ImageJ的安装与简单使用
  9. 回归预测 | MATLAB实现LSSVM(最小二乘支持向量机)多输入单输出
  10. java前后端分离使用token_前后端分离以及token的使用