Java的hashmap:keys()确实丢失了吗?

时间:2012-01-28 08:35:35

标签: java map hashmap hashtable javadoc

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

HashTable中,有两种方法可以获取哈希表的密钥:

Keys

  


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

  

public Set keySet()
  返回此处包含的键的Set视图   哈希表。 Set由Hashtable支持,因此更改为   Hashtable反映在Set中,反之亦然。集支持   元素删除(从中删除相应的条目)   Hashtable),但不是元素添加。

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

keys()没有提到这一点。

所以我的问题是:

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

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

一般情况下,非同步集合上的迭代器表现不是特别好(它们倾向于抛出ConcurrentModificationException或以未指定的方式运行)

通过looking at the source code for Hashtable,您可以看到键集的iterator和keys()枚举实际上是由同一个内部类实现的,如果Hashtable发生更改,它将尝试抛出ConcurrentModificationException。所以,不,它不会复制密钥。