2011-12-03 58 views
2

我有一個包含哈希映射作爲成員的java類。這個類是用很多對象創建的。在這些情況中的許多情況下,這種類型的一個對象被克隆到另一個對象,然後被更改。克隆是必需的,因爲這些更改修改了散列映射,我需要保持原始對象的原始散列映射不變。有關加速克隆哈希映射的Java代碼的任何建議?

我想知道如果有人有任何建議如何加快克隆部分,或者可能有一些技巧來避免它。當我剖析代碼時,大部分時間都花在克隆這些哈希映射(通常具有非常小的值集合,幾百個左右)上。

(我目前使用的小馬OpenIntDoubleHashMap執行。)

+0

我查看了HashMap的代碼,'clone'只是從頭開始,重新計算所有散列鍵。你可以重寫HashMap的一個子類,但它會過度殺傷,並且可能有一個很好的理由爲什麼他們選擇了這樣一個低效的clone。 – toto2

+0

將標題更改爲更具體 – MartinL

回答

1

你應該使用更有效的算法吧。查看http://code.google.com/p/pcollections/庫,允許不可變映射的PMap結構。

UPDATE

如果您的地圖是相當小的(你說的只有幾百),也許更有效的將只是兩個數組:

int keys[size]; 
double values[size]; 

在這種情況下,克隆的地圖,你只需要使用System.arraycopy這應該工作得非常快。

+0

我喜歡這個想法,理論上這是我需要的,但是使用它實際上會讓我的代碼變得更慢...... – kloop

+0

您能否提供一些基準測試代碼?也許你正在做一些無效的事情。 – kan

+0

我將此設置爲答案,因爲它似乎是最接近的,它應該在理論上起作用。儘管如此,大集會在這種情況下似乎沒有幫助。 – kloop

0

如果原始文件偶爾發生更改,可能會爲您的地圖實施copy-on-write包裝。

+0

我實際上有copy-on-write這裏..它只複製散列映射使用改變它的方法。這並沒有什麼幫助,因爲大部分哈希映射在某個時刻都需要被複制。 – kloop

0

如果僅對象的一小部分改變,你可以實現一個兩層結構:

  1. 1層是原來的地圖。
  2. 第2層僅保留更改的元素。

需要更改的原始地圖中的任何對象都會被克隆,修改放置到第2層地圖中。

查找首先查閱第2層貼圖,如果找不到該對象,則回退到第1層貼圖。