java中Map类

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

java中Map类

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 元素的开销进行了比较:

Profilers in Oracle JDeveloper

Oracle JDeveloper 包含一个嵌入的监测器,它测量内存和执行时间,使您能够快速识别代码中的瓶颈。我曾使用Jdeveloper 的执行监测器监测HashMap 的containsKey() 和containsValue() 方法,并很快发现containsKey() 方法的速度比containsValue() 方法慢很多(实际上要慢几个数量级!)。(参见图 1 和图2,以及随附文件中的Test2 类)。

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%。因此,如果由于某种原因要创建一个集合元素的数组而

相关文档
最新文档