编程语言
首页 > 编程语言> > 在没有java.lang.Map API的情况下遍历Hashtable条目的最佳方法是什么?

在没有java.lang.Map API的情况下遍历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%的时间是这样:过早的优化是万恶之源.”除非代码的特定部分是一个巨大的瓶颈,否则我建议您对每个键进行查找.

标签:hashtable,blackberry,java
来源: https://codeday.me/bug/20191208/2094655.html