在没有java.lang.Map API的情况下,迭代哈希表条目的最佳方法是什么?
我正在开发一个没有Collections API的BlackBerry j2me Java实现。因此没有在没有java.lang.Map API的情况下,迭代哈希表条目的最佳方法是什么?,java,blackberry,hashtable,Java,Blackberry,Hashtable,我正在开发一个没有Collections API的BlackBerry j2me Java实现。因此没有entrySet()方法或Map.Entry类。迭代哈希表的映射的唯一可用方法是元素()和键()方法 我能期望elements()和keys()以相同的顺序返回相同数量的映射吗?如果是,我可以做以下工作: Enumeration keys = table.keys(); Enumeration elements = table.elements(); String key, value; wh
entrySet()
方法或Map.Entry
类。迭代哈希表的映射的唯一可用方法是元素()
和键()
方法
我能期望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对象。)事实上,很难想象除了通过迭代存储桶之外,还可以通过其他方式获得值
然而,语言规范并没有规定它们的顺序必须相同,因此如果您做出这样的假设,您将阻碍可移植性,并可能在以后引入难以发现的bug。我想是算法专家Donald Knuth说的,“我们应该忘记小效率,比如说97%的时间:过早优化是万恶之源。”除非代码的特定部分是一个巨大的瓶颈,否则我建议您查找每个键。大部分同意。但是,由于这是一个只支持黑莓的应用程序,而且其实现已经很成熟,所以可移植性和前向兼容性就不那么重要了。我通常是老克努斯名言的粉丝,但人们确实把它作为无知的借口。如果我知道一种方法更好,那么我没有理由不在第一次做正确的方法。我在我们的代码库中找到了另一个地方,我们依赖于这个假设,它是有效的,所以我将继续使用它。同时请记住,您编写的代码是供程序员阅读的。即使这种关系成立,它也不是众所周知的,未来的开发人员也很难理解。哈希表在查找键方面很快——事实上是常数时间——因此使用这两个枚举数所节省的成本并不高,除非这是一段非常热门的代码,与未来代码更改的混乱情况相比。事实上,我发现第一个更容易阅读。这就像,“好吧,我从这个表中获取所有的键和值,现在我对它们进行迭代。很简单。”所以我想这只是个人偏好。