2015-05-21 78 views
0

我在一個方法中運行下面的代碼,但在返回鍵和值<「dataInicio」>,<「orange」>時位於地圖的位置6,而不是位置一像它應該。有什麼可以做到這一點?爲什麼我的HashMap將一個元素放在位置6而不是下一個空位置?

我創建的這張地圖將參數發送給Jasper報告,並將dataInicio置於位置6,然後將dataFim放置在位置1和位置3的listaParametros中。這很瘋狂。

下面的代碼:

final Map<String, Object> parameters = new HashMap<String, Object>(); 
     parameters.put("SUBREPORT_DIR", "apple"); 
     parameters.put("dataInicio", "orange"); 
     parameters.put("dataFim", "melon"); 
     parameters.put("listaParametros", "banana"); 
     return parameters; 

而這裏的表現形式日食打印屏幕查看:enter image description here

+6

因爲這就是HashMap的工作原理 - 密鑰是根據哈希碼插入到桶中的,所以插入順序不會被保留。你可能想嘗試一下'String,Object'對的列表。 – Marvin

+1

爲什麼要在位置1? –

+1

其他人告訴你關於'HashMap',但還有其他'Map'實現(例如'TreeMap'和'ConcurrentSkipListMap'),它們保持按照它們的自然排序排序的鍵。 –

回答

2

這是整點HashMap。事實上,這就是「散列」這個詞的意思。在許多情況下,元素應該放在表格中基本上隨機的位置上 - 散列碼修改表格的大小。

這是HashMap文檔中爲什麼說「這個類不能保證地圖的順序,特別是它不能保證順序會隨着時間的推移保持不變」。

+0

你是對的,尷尬的錯誤。 – StudioWorks

+1

如果您使用'LinkedHashMap',則可以保留插入順序,但後備存儲仍然是一個哈希表,因此您的數據將以這種令人反感的方式重新排列。好消息是,你可以按照可預測的順序將其恢復。 –

+0

@ChristopherSchultz我應該按照它們在地圖中排列的順序來定義報表參數,所以如果它包含元素,空桶和我在第六個位置需要的元素,我認爲它不會起作用。 – StudioWorks

2

哈希表不是列表,該指數與根據數據,你的哈希函數計算實際上,有時不同的數據會得到相同的索引,當發生這種情況時,哈希映射有一種機制可以爲其中的一個索引分配不同的索引。

1

因爲這就是HashMap的工作原理 - 密鑰根據哈希碼插入到桶中,所以插入順序不會被保留。您可能想要嘗試一個String, Object對的列表或LinkedHashMap(它不會更改任何有關內部存儲的內容,但至少可以按插入順序返回值)。

+0

在我的理解中,我必須按照我在代碼中聲明的順序設置報表參數。我使用LinkedHashMap,但正如你所指出的那樣,它不會改變它的內部存儲,所以我得到相同的錯誤,因爲Map中元素的順序與它在報告中聲明的順序不同。有什麼想法? – StudioWorks

+0

@StudioWorks:你準確得到什麼錯誤?或者:你以後如何閱讀價值觀? – Marvin

+0

我想通了。這是在我的評論。謝謝您的幫助。 – StudioWorks

相關問題