HashMap的KeySet、EntrySet和values在表不为空时为null

4
我正在读取一个名为data.ser的文件,用来填充一些保存数据的HashMap。尽管我的Map里面有我应该拥有的值,但是KeySetEntrySet和values却是null。例如,当我在调试模式下检查Hashmap“Employees”时,它看起来像这样:hashmap as shown with debugs inspect option:。 有人可以帮助我弄清楚问题出在哪里吗?这种情况怎么可能会发生?下面是一个返回null值的例子,尽管map中包含一个具有我正在搜索的键(ID)的值(Employee):problem example

你为什么对这些内部字段感兴趣?如果你使用HashMap的公共方法,它会正确地运行,对吗? - WonderCsabo
如果我尝试通过给定的键搜索地图,它总是返回null,因为keySet为null。我想。 - Roi811
1
如果底层Map(存储在“m”成员中)包含该键,则不会返回null。 - Eran
我有所怀疑。Map 返回 null 是因为要么键不存在,要么键对应的值确实是 null - WonderCsabo
@Roi811 如果你发布实际遇到的问题(例如,如果我尝试按给定的键搜索地图,它总是返回null,并且详细说明/举例),而不仅仅展示你所查看的一小部分,你将获得更有效的帮助。 - tobii
@tobii 你说得对。我在帖子中添加了一个例子。 - Roi811
1个回答

4

这是一个不可修改的Map

你提到的数据成员被初始化为null:

private transient Set<K> keySet = null;
private transient Set<Map.Entry<K,V>> entrySet = null;
private transient Collection<V> values = null;

同名方法访问底层Map以返回非空值,并在首次调用时将其缓存在这些变量中。

public Set<K> keySet() {
    if (keySet==null)
    keySet = unmodifiableSet(m.keySet());
    return keySet;
}

public Set<Map.Entry<K,V>> entrySet() {
    if (entrySet==null)
    entrySet = new UnmodifiableEntrySet<K,V>(m.entrySet());
    return entrySet;
}

public Collection<V> values() {
    if (values==null)
    values = unmodifiableCollection(m.values());
    return values;
}

因此,如果您调用这三种方法,您将看到这些数据成员不再为空。

谢谢你的回答。我正在努力找到适当的位置来放置这些方法。原因是,我有一个准备好的Java程序,我应该为它编写一个合适的GUI。此外,在“视图”类中声明了多个HashMap作为该程序的数据库。正如你所提到的,getter确实会发送这些映射的UnmodifiableMap。 - Roi811

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