在没有java.lang.Map API的情况下迭代Hashtable条目的最佳方法是什么?

时间:2010-12-29 17:11:28

标签: java blackberry hashtable

我正在开发没有Collections API的BlackBerry j2me Java实现。因此,没有entrySet()方法或Map.Entry类。迭代Hashtable映射的唯一可用方法是elements()keys()方法。

我可以期望elements()keys()以相同的顺序返回相同数量的映射吗?如果是这样,我可以执行以下操作:

Enumeration keys = table.keys();
Enumeration elements = table.elements();
String key, value;
while(keys.hasMoreElements()) {
    key = keys.nextElement();
    value = elements.nextElement();
}

我认为情况就是这样,但文档并没有肯定地说。如果我不能做出这个假设,那么我将只需要遍历键:

Enumeration keys = table.keys();
String key, value;
while(keys.hasMoreElements()) {
    key = keys.nextElement();
    // Less efficient b/c I have to do a lookup every time.
    value = table.get(key);
}

编辑:您可以假设只有一个线程可以访问该表。

1 个答案:

答案 0 :(得分:3)

保证他们返回相同的数量项目。在Sun的实现中,键和值以相同的顺序返回。 (实际上,在同一个类中,同一个类用于迭代键,值或Map.Entry对象。)实际上,很难想象除了通过遍历桶之外以某种方式获取值。

但是,语言规范并没有说它们必须处于相同的顺序,所以如果你做出这个假设,你将会阻碍可移植性并可能在以后引入难以发现的错误。我认为正是算法专家唐纳德克努特说:“我们应该忘记效率不高,大约97%的时间说:过早的优化是所有邪恶的根源。”除非代码的特定部分是一个巨大的瓶颈,否则我建议您对每个密钥进行查找。

相关问题