【问题标题】:Java Iteration: Hashtable vs HashMapJava 迭代:Hashtable 与 HashMap
【发布时间】:2011-07-27 16:01:38
【问题描述】:

为什么当我为 hashtable 和 hashmap 运行等效代码时会得到不同的结果?

Iterator<Integer> it = ht.keySet().iterator();
while(it.hasNext()) {
    i = it.next();
    System.out.println(i + " : " + ht.get(i));
}

ht 是一个哈希表对象。如果我用 hm 替换,一个 hashmap 对象,它不会打印来自 get() 方法的值,而是打印 null。这是为什么呢?

【问题讨论】:

  • 您确定没有忘记在初始化时切换对象吗?具体来说,您将对象放入 ht 中,但尝试从 hm 中检索它们?
  • 差异肯定来自其他原因。尝试简单地输出ht.toString() 进行比较。
  • 当我运行一个更完整的测试用例时,我没有得到不同的结果。 (好吧,我得到不同的订单)。你会发布你使用的完整代码吗?
  • 对不起伙计们,我在某一时刻切换了迭代器的使用,结果很糟糕。已纠正,感谢cmets!
  • @dryHump:你能用你的“解决方案”发布答案吗?

标签: java hashmap hashtable iteration


【解决方案1】:

虽然从技术上讲不是您问题的“答案”(由于问题中提供的代码不足,这是不可能的),但我确实对代码样式提出了这个建议。

这将帮助您避免在代码中发现的错误(根据您后来的评论)。

您提供的代码:

Iterator<Integer> it = ht.keySet().iterator();
while(it.hasNext()) {
    i = it.next();
    System.out.println(i + " : " + ht.get(i));
}

相当于entry set上的这个更优雅的foreach循环:

for (Map.Entry<Integer, Object> entry : ht.entrySet()) {
    System.out.println(entry.getKey() + " : " + entry.getValue());
}

如果可以,请优先使用此表单,而不是直接使用迭代器。
更整洁了,less code == good

【讨论】:

    【解决方案2】:

    我认为使用 HashMap 你必须得到 entrySet。然后,您可以遍历每个条目...

    这是一个关于迭代 HashMap 的参考:

    http://www.java2s.com/Code/JavaAPI/java.util/HashMapentrySet.htm

    我同意你最初的想法——不知道为什么会这样......

    【讨论】:

    • 你可以这样做,而且效率更高,但没有理由 keySet() + get() 不应该工作。
    • @David - 谢谢 - 我是 Java 新手,遇到了与 Dry 类似的 keySet 问题......从那以后我一直在使用 entrySet...... 显然对我有利,但是由于错误的原因:)
    猜你喜欢
    • 1970-01-01
    • 2015-09-19
    • 2011-03-21
    • 2010-11-15
    • 2015-12-20
    • 1970-01-01
    • 2011-01-22
    • 2011-03-16
    • 2015-04-13
    相关资源
    最近更新 更多