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。
如果用过它,就会知道它的用处了。
资料:
java.util 中的集合类包含 Java 中某些最常用的类。 最常用的集合类是 List 和 Map。 List 的具体实现包括 ArrayList 和 Vector,它们是可变大小的列表,比较适合构建、存储和操作任何类型对象的元素列表。 List 适用于按数值索引访问元素的情形。
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)。
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()。
发表评论
-
使用 apache的 common FTPClient 操作ftp
2009-01-05 09:41 1771import java.io.File; import ja ... -
sun.net.ftp.FtpClient类
2008-12-29 22:52 1865sun.net.ftp.FtpClient.,该类库主要提供了 ... -
Excel 读写操作
2008-09-18 15:42 972package trans; import java.io.B ... -
Oracle数据导入导出imp/exp命令
2008-09-09 13:05 872Oracle数据导入导出imp/exp就相当于oracle数据 ... -
Java实用经验总结--日期、数字篇
2008-08-25 16:48 1186Java实用经验总结--日期、数字篇1. 日期部分对于像日 ... -
ORACLE SQL and SQL*PLUS
2008-08-15 10:16 1330四、从多个表里选取数据记录 1. 数据表间的连接 简单的连接语 ... -
常用的SQL语法和数据对象
2008-08-14 12:16 832控制语句 (DML) 部分 1.INSERT (往数据表里 ... -
Oracle 排序中常用的NULL值处理方法
2008-08-14 12:10 11651、缺省处理Oracle在Order by 时缺省认为null ... -
sun.net.ftp.FtpClient使用
2008-08-06 21:10 7836FTP使用sun.net.ftp包下的api,package ... -
加密
2008-04-03 09:28 1437import javax.crypto.Cipher;impo ... -
获得星期信息
2008-04-03 09:20 995String str = "2008-03-03&q ...
相关推荐
自定义javascript的Map类,使用习惯完全依据于java的map使用习惯编写,java中map的用法基本一样,导入包即可使用
本文将详细讲解如何使用Java实现XML到Map以及Map到XML的一键转换,并介绍一个已封装好的工具类`EasyXmlUtil`。 首先,XML到Map的转换涉及到XML的解析。在Java中,我们可以使用`javax.xml.parsers....
在本案例中,"c++MAP使用例子程序"是一个在Visual Studio 2005环境下通过编译并运行的示例,旨在帮助学习者理解如何在C++中有效使用`std::map`。 `std::map`的基本操作包括插入元素、查找元素、删除元素以及迭代器...
通常,该类会使用反射机制遍历`Map`中的每个键值对,根据键来找到对应实体类的setter方法,并调用它设置值。为了确保安全,工具类可能还会包含一些错误处理机制,如检查键是否存在,值类型是否匹配等。 在实际开发...
对于大型项目,你可能还会考虑使用ES6的类语法来定义`ClassMap`,并利用`Symbol.iterator`来实现可迭代特性,使其更符合JavaScript的现代规范。 总之,`classMap`是一个定制的数据结构,用于存储和管理类的相关信息...
介绍了java中map用法,对一些不知道map怎么用的同学有帮助
【Java Map 集合类简介】 在Java的`java.util`包中,集合类扮演着重要的角色,其中List和Map是最为常见的两种。List的实现例如ArrayList和Vector,它们都是可变大小的列表,适合存储和操作各种类型对象的序列。特别...
- OpenStreetMap Wiki的“Map Features”条目提供了多种语言版本,目的是帮助用户翻译并推广使用。 - 用户可以通过不同语言的页面,来查看各自的语言版本的设施标签。 5. 提出新图标或标记已弃用的特征: - 如果...
### 在STL的map或set容器中使用类作为key #### 概述 在C++标准模板库(STL)中,`map` 和 `set` 容器是两种非常重要的容器类型,它们提供了高效的键值对管理和有序集合的管理方式。在实际应用中,我们常常需要使用...
最常用的集合类是 List 和 Map。 List 的具体实现包括 ArrayList 和 Vector,它们是可变大小的列表,比较适合构建、存储和操作任何类型对象元素列表。 List 适用于按数值索引访问元素的情形。 Map 提供了一个更...
Map和Bean之间的转换就是这类场景的一个典型例子。`MapUtils`和`BeanUtils`这样的工具类能够帮助我们高效且灵活地进行这种转换。本文将详细探讨这两个工具类的功能以及它们在实际开发中的应用。 `MapUtils`类通常...
标题中的“使用Map-Reduce对大规模图进行排名和半监督分类”是指利用MapReduce编程模型处理大规模图数据,实现图的排序(如PageRank)和半监督学习中的分类任务。MapReduce是由Google提出的一种分布式计算框架,适用...
使用xml转json,可以使用这个工具类,先转成map,之后使用自己的json工具类即可。
下面是一个简单的工具类`CollectionTools`的示例代码,它使用泛型和反射实现了Map到实体的转换: ```java import java.lang.reflect.Field; import java.util.Map; public class CollectionTools { /** * 将Map...
// java中对象容器主要有Set,List和Map三个接口类。 // 迭代器(Iterator)模式,又叫做游标(Cursor)模式。 // GOF给出的定义为:提供一种方法访问一个容器(container)对象中的各个元素, // 而又不需暴露该...
### VS MAP 文件使用详解 #### 一、引言 在软件开发过程中,程序崩溃是常见的问题之一,尤其在复杂的多线程环境中,定位崩溃的原因往往非常困难。Microsoft Visual Studio (以下简称VS) 提供了多种工具和技术来...
在Java编程语言中,Map接口是集合框架的重要组成部分,它提供了键值对(key-value pairs)的存储方式。Map不是列表或数组,而是允许我们通过一个键...理解并正确使用这些Map类可以帮助你编写更高效、更可读的Java代码。
这是一个工具类用于判断map中的键值对是否为空!普通判断若遇上空会报空指针异常!
标题中的“根据Map动态生成一个类 动态打印”指的是在编程中,我们有时需要根据运行时的数据结构,如Map,动态地创建对应的类实例。这通常涉及到Java反射API(Reflection API)和Java代理(Proxy)等技术。Map作为...
例如,在Hadoop MapReduce中,InputFormat类负责将输入数据拆分为多个Map任务,每个任务处理一部分键值对。 接下来,List拆分与Map拆分类似,但更专注于有序或无序元素的序列。List通常包含一组元素,这些元素可以...