Java HashMap中的键集字段为空

Java HashMap中的键集字段为空,java,collections,map,hashmap,Java,Collections,Map,Hashmap,我正试图使用keySet()方法在HashMap上循环,如下所示: for (String key : bundle.keySet()) { String value = bundle.get(key); ... } 在代码的其他部分,我在HashMaps上使用了很多for-each循环,但这是一个奇怪的行为:它的大小是7(这是正常的),但是键集,入口集和值都是null(根据Eclipse调试器) “bundle”变量的实例化和填充方式如下所示(无原始内容…): Map-pri

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

for (String key : bundle.keySet()) {
    String value = bundle.get(key);
    ...
}
在代码的其他部分,我在HashMaps上使用了很多for-each循环,但这是一个奇怪的行为:它的大小是7(这是正常的),但是
键集
入口集
都是
null
(根据Eclipse调试器)

“bundle”变量的实例化和填充方式如下所示(无原始内容…):

Map-privVar;
构造函数(){
privVar=newhashmap();
}
公共void添加(字符串键、字符串值){
this.privVar.put(键,值);
}

您所说的
键集
入口集
是什么意思?如果您指的是
HashMap
的内部字段,那么您不应该查看它们,也不必关心它们。它们用于缓存

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

public Set<K> keySet() {
    Set<K> ks = keySet;
    return (ks != null ? ks : (keySet = new KeySet()));
}
公共设置键集(){
设置ks=键集;
返回(ks!=null?ks:(keySet=newkeyset());
}
因此,
keySet
null
这一事实与此无关
keySet()
(方法)永远不会返回
null


同样的情况也适用于
entrySet()
values()

如果你在HashMaps上做了大量的for each循环,我想你可能需要改变你的结构。我同意@Macarse。另外:如果您想在
Map
上循环,并且需要键和值,通常最好在
entrySet()
上循环,以避免对每个键进行不必要的查找。感谢您的建议Joachim,我会这样做@Macarse:在创建新的电子表格之前,我将值放入从文件(Excel电子表格)中提取的映射键值对中,以应用一组语法规则(regExp检查)。你认为映射不是一个好的存储对象吗?那么你在做一个映射,其中键是一行,值是正则表达式?不,不。键是键,值是转换。它相当于一个“ResourceBundle属性”文件。因此,映射是ResourceBundle的等价物。这就是启发我的原因:)看起来Eclipse调试器确实在“table”字段中显示了所需的信息。在Java 7中,它使用data.keySet().toArray()为我返回null;其中数据是哈希映射,而不是null@tricknology:如果是这样的话,我建议你把它作为一个新问题发布(最好是用一个新问题)。
public Set<K> keySet() {
    Set<K> ks = keySet;
    return (ks != null ? ks : (keySet = new KeySet()));
}