【问题标题】:What is the BEST way to iterate through Hashtable entries WITHOUT the java.lang.Map APIs?在没有 java.lang.Map API 的情况下迭代 Hashtable 条目的最佳方法是什么?
【发布时间】:2010-12-29 17:11:28
【问题描述】:

我正在开发一个没有 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);
}

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

【问题讨论】:

    标签: java blackberry hashtable


    【解决方案1】:

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

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

    【讨论】:

    • 大部分同意。但由于这是一个仅限 BlackBerry 的应用程序,并且实施已经完善,因此可移植性和前向兼容性不再是问题。而且我通常是老 Knuth 名言的粉丝,但人们确实用它作为无知的借口。如果我知道一种方法更好,那么我没有理由不应该第一次就以正确的方式去做。我在我们的代码库中找到了另一个我们依赖这个假设的地方,并且它有效,所以我将继续使用它。
    • 另外请记住,您正在编写供程序员阅读的代码。即使这种关系成立,也不是众所周知的,未来的开发者也很难理解。哈希表查找键的速度很快——实际上是恒定的时间——因此与未来代码更改的混乱相比,除非这是一段非常热门的代码,否则使用这两个枚举器所节省的成本并不是那么好。跨度>
    • 我实际上发现第一个更容易阅读。这就像,“好的,我正在从这个表中获取所有的键和值,现在我正在迭代它们。很简单。”所以我想这只是个人喜好。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-28
    • 2023-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多