访问元素
表 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() 所需的时间要长很多。实际上要长几个数量级!(参见 和 ,以及随附文件中的 。因此,如果 containsValue() 是应用程序中的性能问题,它将很快显现出来,并可以通过监测您的应用程序轻松地将其识别。这种情况下,我相信您能够想出一个有效的替换方法来实现 containsValue() 提供的等效功能。但如果想不出办法,则一个可行的解决方案是再创建一个 Map,并将第一个 Map 的所有值作为键。这样,第一个 Map 上的 containsValue() 将成为第二个 Map 上更有效的 containsKey()。
 | 图 1: 使用 JDeveloper 创建并运行 Map 测试类 |
 | 图 2: 在 JDeveloper 中使用执行监测器进行的性能监测查出应用程序中的瓶颈 |
|