【问题标题】:Java's hashmap: Is keys() indeed missing?Java 的 hashmap:keys() 确实丢失了吗?
【发布时间】:2012-02-21 01:42:43
【问题描述】:

Java 的HashTable 是一个同步的哈希表(并且存在了很长一段时间),而HashMap 是一个非同步的。

HashTable中,有2种方式获取hashtable的key:

Keys 其中:


public Enumeration keys() 返回键的枚举 这个哈希表。

公共设置 keySet()
返回 this 中包含的键的 Set 视图 哈希表。 Set 由 Hashtable 支持,因此对 Hashtable 反映在 Set 中,反之亦然。该套装支持 元素删除(从 Hashtable),但不是元素添加。

在后者中明确指出键是对哈希表的直接引用(因此请注意修改等)。

但是keys() 没有这样的提及。

所以我的问题是:

使用枚举器的keys() 是否返回密钥的副本(与返回实际密钥的keyset() 不同)?
如果是,为什么HashMap 中没有这种方法而只提供keyset()

【问题讨论】:

    标签: java map hashmap hashtable javadoc


    【解决方案1】:

    Hashtable.keys 返回对真实键的引用。它不会复制它们。

    HashMap 中不存在该方法,因为 keySet 已经完成了这项工作。它存在于哈希表中,因为这个类自 java 1.0 以来就已经存在。直到 1.2 才添加定义 keySet 方法的集合框架。

    【讨论】:

      【解决方案2】:

      一般来说,非同步集合上的迭代器表现不佳(它们倾向于抛出 ConcurrentModificationException 或以未指定的方式运行)

      通过looking at the source code for Hashtable,你可以看到key set的迭代器和keys()枚举实际上是由同一个内部类实现的,如果Hashtable发生变化,它会尝试抛出ConcurrentModificationException。所以,不,它不会复制密钥。

      【讨论】:

      • 所以它的底层实现是相同的?那么带有Enumerator 的API 提供了什么,它是可用的?
      • Hashtable 和 Enumerator API 在这一点上已被弃用,不应在新代码中使用。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-12-31
      • 2017-02-23
      • 1970-01-01
      • 1970-01-01
      • 2019-10-04
      • 2020-11-23
      • 1970-01-01
      相关资源
      最近更新 更多