快速业务通道

java api接口篇(二)上 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-22
和List接口一样, Map加强了对equals和hashCode方法的要求, 于是, 两个Map对象可做逻辑等同性比较而不必考虑它们的实现类型。如果它们显示了相等的键-值映射, 则两个Map对象是相等的。

按惯例, 所有的Map实现可提供构造函数; 该构造函数提取一个Map对象并将这个新的Map初始化, 使之包含特定Map中的所有键-值映射。这个标准Map构造函数是为Collection实现而设计的标准对象集 构造函数的完全对等物。它允许调用者创建一个期望的实现类型的Map ; 该实现类型初始包含另一个Map的所有映射。而不考虑其它Map的实现类型。例如,假设你有一个命名为m的Map, 则下列一行代码创建了一个新的HashMap, 它初始包含所有与m相同的键-值映射:

Map copy = new HashMap(m);

批量操作(Bulk Operations)

clear操作所完成的工作正象其词义上所表达的那样: 它从Map 中删除所有映射。putAll操作是Collection接口中的addAll操作的Map对等物; 它可将一个Map转储至另一个, 除此之外, 它还有一个更微妙的用处。假设一个Map被用来表示属性-值对(attribute-value pairs ) ; putAll操作将与标准Map构造函数一起提供一种用默认值创建属性表的简捷方法。以下是一个可演示此种技术的静态方法:

static Map newAttributeMap(Map defaults, Map overrides) { Map result = new HashMap(defaults); result.putAll(overrides); return result; }

Collection视图

Collection视图 方法允许以三种方式将一个Map作为一个Collection来视图:

keySet: 包含在Map中的键的Set。

values: 包含在Map中的值的Collection。该Collection不是一个Set, 因为多个键可映射相同的值。

entrySet: 包含在Map中的键-值对的Set 。Map接口提供了一个小的被称作Map.Entry的嵌套接口,它是在这个Set中的元素的类型。

Collection视图提供了在Map上进行迭代的唯一方法。下面的例子给出了在一个Map上迭代键的标准惯用程序:

for (Iterator i=m.keySet().iterator(); i.hasNext(); ) System.out.println(i.next());

对值进行迭代的惯用程序是类似的。这是迭代键-值对的惯用程序:

for (Iterator i=m.entrySet().iterator(); i.hasNext(); ) { Map.Entry e = (Map.Entry) i.next(); System.out.println(e.getKey() + ": " + e.getValue()); }

java api接口篇(二)上(3)

时间:2010-12-24

第一次提交这些惯用程序时,许多人考虑到每次调用一个Collection视图时,Map都必须创建一个新的Collection对象,因而担心其速度慢。请放心:这是不可能的。如果每次一个Map被要求给出一个特定的Collection视图时,没有道理Map不能总是返回相同的对象。这恰恰是所有JDK的Map实现所要作的事。

用所有三个Collection视图, 调用一个Iterator的remove的操作可从后备Map中删除相关项(假设该Map支持删除)。用entrySet视图, 通过在迭代过程中调用一个Map.Entry的setValue方法 (再一次假设该Map支持值的更改),也可能改变与一个键相关的值。请注意这是在迭代过程中更改一个Map的唯一安全途径。

Collection视图支持它的所有形式的元素删除:remove, removeAll, retainAll, 和clear操作, 以及Iterator.remove操作 (然而,这是建立在假设后备Map支持元素删除的基础之上)。

Collection视图在任何情况下都不支持元素增加。对keySet和values视图这是无意义的,而对entrySet视

Collection视图的奇特用法: Map代数

在应用Collection视图时,批量操作 (containsAll, removeAll和retainAll) 是一个惊人的有力工具。假设你要了解一个Map是否是另一个的子映射(submap),也就是说,第一个Map是否包含第二个的全部键-值映射,请看下面惯用程序的小技巧:

if (m1.entrySet().containsAll(m2.entrySet())) { .. }

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号