2014-08-27 76 views
3

我正在閱讀data.ser文件以填充一些HashMap s已保存的數據。HashMap的KeySet,EntrySet和值爲空,而表不爲空

儘管Map具有我應該擁有的值,但KeySet,EntrySet和值均爲空。 例如,Hashmap「員工」是這樣的,當我檢查它在調試模式:

hashmap as shown with debugs inspect option:

有人可以幫助我弄清楚什麼是錯呢?這種情況怎麼可能呢?

爲雖然地圖返回一個空值的實例包含一個值(員工)與密鑰(ID)IM搜索: problem example

+0

你爲什麼對這些內部領域感興趣?如果你使用公共方法,HashMap的行爲正確,對吧? – WonderCsabo 2014-08-27 21:30:30

+0

如果我嘗試按給定的鍵搜索地圖,它總是返回null,因爲keySet爲空。我認爲。 – Roi811 2014-08-27 21:34:13

+1

@ Roi811如果底層的Map(存儲在'm'成員中)包含該鍵,它將不會返回null。 – Eran 2014-08-27 21:35:59

回答

4

這是一個UnmodifiableMap

你提到的被初始化爲空的數據成員:

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

相同名稱的方法訪問基礎地圖返回非空值,並在這些變量緩存他們在第一時間,他們被稱爲。

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; 
} 

因此,如果你調用這三個方法,你會看到那些數據成員不再是零。

+0

**感謝您的回答**。我很難弄清楚放置這些方法的適當位置。原因是,我有一個準備好的java程序,我打算爲它編寫一個合適的GUI。更重要的是,有多個HashMap作爲這個程序的數據庫在「view」類中聲明。正如你所提到的,吸氣者的確發送了這些地圖的一個不可修改的地圖。 – Roi811 2014-08-27 22:07:00