Java的HashTable
是一个同步的哈希表(存在很长一段时间),而HashMap
是一个不同步的。
在HashTable
中,有两种方法可以获取哈希表的密钥:
Keys:
键
public Enumeration keys()返回键的枚举 这个哈希表。
和
public Set keySet()
返回此处包含的键的Set视图 哈希表。 Set由Hashtable支持,因此更改为 Hashtable反映在Set中,反之亦然。集支持 元素删除(从中删除相应的条目) Hashtable),但不是元素添加。
在后者中,明确指出密钥是对哈希表的直接引用(因此要注意修改等)。
但keys()
没有提到这一点。
所以我的问题是:
使用枚举器的keys()
是否返回了密钥的副本(与返回实际密钥的keyset()
不同)?
如果是,为什么HashMap
中没有这样的方法,只提供keyset()
?
答案 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。所以,不,它不会复制密钥。