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

标签 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);
}

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

最佳答案

它们保证返回相同的数量 项。在 Sun 的实现中,键和值以相同的顺序返回。 (实际上,在幕后,同一个类用于遍历键、值或 Map.Entry 对象。)确实,很难想象除了遍历存储桶以外的其他方式获取值。

但是,语言规范并没有说它们必须以相同的顺序排列,所以如果您做出这样的假设,您将阻碍可移植性并可能在以后引入难以发现的错误。我认为是算法专家 Donald Knuth 说过,“我们应该忘记效率低下,大约 97% 的时间:过早优化是万恶之源。”除非代码的那个特定部分是一个巨大的瓶颈,否则我建议您对每个键进行查找。

关于java - 在没有 java.lang.Map API 的情况下迭代哈希表条目的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4556141/

相关文章:

java - 如何为黑莓实现条码扫描仪?

c# - 如何在 C# 中以相同的顺序将列表中的键添加到哈希表

algorithm - 通过线性探测实现调整哈希表大小的时间复杂度

java - MongoDb TimeZone 中的日期查询问题

blackberry - 黑莓手机上不能使用 SOAP

java - 总是归零

css - 黑莓浏览器自动插入蓝色背景

c# - 为什么不能将 null 用作 Dictionary<bool?, string> 的键?

java - 为什么我收到 "Trigger' s 相关的作业名称不能为空” quartz 错误

使用特定对象引用的 Java 同步块(synchronized block)