【问题标题】:HashMap's KeySet, EntrySet, and values are null while table is not emptyHashMap的KeySet、EntrySet、values为null而table不为空
【发布时间】:2014-08-27 21:23:47
【问题描述】:

我正在读取一个data.ser 文件以用保存的数据填充一些HashMaps。

虽然Map 有我应该有的值,但KeySetEntrySet 和值都是空的。 例如,Hashmap“Employees”在调试模式下检查时看起来像这样:

有人可以帮我弄清楚它有什么问题吗?这种情况怎么可能发生?

尽管映射包含一个值 (Employee) 和键 (ID) 我正在搜索,但返回空值的示例:

【问题讨论】:

  • 您为什么对这些内部字段感兴趣?如果您使用它的公共方法,HashMap 的行为正确,对吗?
  • 如果我尝试通过给定的键搜索地图,它总是返回 null,因为 keySet 为 null。我想。
  • @Roi811 如果底层 Map(存储在 m 成员中)包含该键,则不会返回 null。
  • 我对此表示怀疑。 Map 返回 null,因为键不存在或键的值确实是 null
  • @Roi811 如果您发布您遇到的实际问题,您将获得更有效的帮助(如果我尝试按给定键搜索地图,它总是返回 null,并详细说明/举例),而不是只展示你所研究的一小部分。

标签: java eclipse collections hashmap keyset


【解决方案1】:

这是UnmodifiableMap

你提到的数据成员被初始化为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。
猜你喜欢
  • 1970-01-01
  • 2015-03-19
  • 2011-01-17
  • 1970-01-01
  • 2016-02-05
  • 1970-01-01
  • 2012-03-23
  • 2012-02-16
相关资源
最近更新 更多