【问题标题】:keySet field in HashMap is nullHashMap 中的 keySet 字段为空
【发布时间】:2011-01-17 08:46:50
【问题描述】:

我正在尝试使用keySet() 方法循环HashMap,如下所示:

for (String key : bundle.keySet()) {
    String value = bundle.get(key);
    ...
}

我在代码的其他部分在 HashMaps 上使用了很多 for-each 循环,但这是一种奇怪的行为:它的大小为 7(这是正常的)但 keySetentrySetvaluesnull(根据 Eclipse 调试器)!

“bundle”变量的实例化和填充如下(没有原始...):

Map <String, String> privVar;
Constructor(){
    privVar = new HashMap<String, String>();
}
public void add(String key, String value) {
    this.privVar.put(key, value);
}

【问题讨论】:

  • 如果你在 HashMaps 上做很多 for-each 循环,我想你可能想改变你的结构。
  • 我同意@Macarse。另外:如果您想循环遍历 Map 并且需要键和值,通常最好循环遍历 entrySet() 以避免对每个键进行不必要的查找。
  • 感谢您的建议 Joachim,我会这样做的。 @Macarse:我将值放入从文件(Excel 电子表格)中提取的映射键值对中,以在创建新电子表格之前应用一组语法规则(regExp 检查)。你认为地图不是存储这个的好对象吗?
  • 所以你正在做一个 Map ,其中键是一行,值是正则表达式?
  • 不,不。键是键,值是翻译。它完全等同于“ResourceBundle 属性”文件。所以地图是 ResourceBundle 的等价物。这就是真正启发我的原因:)

标签: java collections map hashmap


【解决方案1】:

keySetentrySetvalues 是什么意思?如果你指的是HashMap的内部字段,那么你不应该看它们,也不需要关心它们。它们用于缓存。

例如在我使用的 Java 6 VM 中,keySet() 是这样实现的:

public Set<K> keySet() {
    Set<K> ks = keySet;
    return (ks != null ? ks : (keySet = new KeySet()));
}

所以keySetnull 的事实是无关紧要的。 keySet()(方法)永远不会返回null

entrySet()values() 也是如此。

【讨论】:

  • 看起来 Eclipse 调试器确实在“表”字段中显示了所需的信息。
  • 它在 Java 7 中使用 data.keySet().toArray() 为我返回 null;其中 data 是 HashMap 且不为空
  • @tricknology:如果是这样,我建议您将其作为一个新问题发布(最好使用SSCCE)。
猜你喜欢
  • 1970-01-01
  • 2021-11-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-25
  • 1970-01-01
  • 1970-01-01
  • 2016-02-05
相关资源
最近更新 更多