HashMap中的keySet字段为空。

9

我正在尝试使用keySet()方法遍历HashMap,代码如下:

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

我在代码的其他部分经常使用HashMap上的for-each循环,但是这个循环有一个奇怪的行为:它的大小是7(正常情况),但是keySetentrySetvalues都是null(根据Eclipse调试器)!

"bundle"变量的实例化和填充如下(没有什么特别的...):

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

2
如果你频繁使用HashMap的for-each循环,我认为你可能需要改变你的结构。 - Macarse
不,不是这样的。键是一个键,值是一个翻译。这相当于“ResourceBundle属性”文件。因此,该映射是ResourceBundle的等效物。这正是激发了我的灵感 :) - Mathieu L
你为什么要迭代它? - Macarse
我正在迭代条目,应用.matches(regexp)并根据定义的捕获器/替换器正则表达式在失败时更改翻译字符串。 - Mathieu L
@Mathieu:抱歉我还是不理解,如果你愿意,请创建另一个问题解释你正在做什么。 - Macarse
显示剩余3条评论
1个回答

20

你提到的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() 同样适用。

1
看起来Eclipse调试器确实在“表格”字段中显示了所需的信息。 - Personman
在Java 7中,使用data.keySet().toArray()时它对我返回null值,其中data是一个HashMap<String,String>且不为null。 - tricknology
@tricknology:如果是这样的话,我建议您将其作为一个新问题发布(最好附带一个SSCCE)。 - Joachim Sauer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接