2013-07-29 60 views
1

我有多個記錄有相似的ID。數據庫是非常傳統的。沒有這樣獨特的專欄。創建日期列用於保存在數據庫中創建行的時間戳。我必須在java map中保留記錄來做一些操作。對於記錄的任何更改,它會創建新記錄。我不想保留hashcode和equals中的所有字段。因爲,我不確定哪個列是針對某個ID進行更改的。把日期放在哈希碼中是不是很好的做法?

首先,我嘗試使用隨機數生成器來生成唯一的哈希碼。有用。

其次,我已決定將創建的日期列放在哈希碼中。它也可以。

把日期放在hashcode中有什麼不利嗎?

+0

hashCode由java中基於散列的集合使用。對於基於散列的集合,它們的工作速度必須不同。所以如果你想知道更多的hashmap,hashset請覆蓋[我的教程](http://volodial.blogspot。com/search/label/Java%20Collections) –

回答

5

的哈希碼和equals應該使用相同的字段,這些字段應有效地不可變(即增加一個散列集合後,不改變)

這可以包括一個日期或任何你喜歡的字段。

順便說一句我比較喜歡用long而不是Date,因爲我可以使它不可變並且速度稍快。

如果你想使用時間戳作爲一個id,你也可以確保它是通過推高毫秒唯一的(或微秒,如果你可以存儲這樣的時間戳)

private static final AtomicLong TIME_STAMP = new AtomicLong(); 
// can have up to 1000 ids per second. 
public static long getUniqueMillis() { 
    long now = System.currentTimeMillis(); 
    while (true) { 
     long last = TIME_STAMP.get(); 
     if (now <= last) 
      now = last + 1; 
     if (TIME_STAMP.compareAndSet(last, now)) 
      return now; 
    } 
} 

private static final AtomicLong TIME_STAMP = new AtomicLong(); 
// can have up to 1000000 ids per second. 
public static long getUniqueMicros() { 
    long now = System.currentTimeMillis() * 1000; 
    while (true) { 
     long last = TIME_STAMP.get(); 
     if (now <= last) 
      now = last + 1; 
     if (TIME_STAMP.compareAndSet(last, now)) 
      return now; 
    } 
} 
0

如果你把一些東西放在一個Map中,那麼我假設你想以後用它來獲取它。密鑰的HashCode()用於標識元素屬於哪個存儲分區。然後在bucket中的所有元素上使用equals()方法來查找匹配。通過使用hashcode()的隨機數生成器,您將無法在映射中找到密鑰,因爲如果密鑰沒有更改,hashcode()函數應該每次返回相同的值。

0

首先,只有當您使用這些對象爲HashMap需要equals()hashCode()方法。

必須有一些概念來確定這些對象相互「相等」的含義。您必須以反映此觀點的方式實施您的equals()hashCode()方法。

對散列碼使用隨機數是一個壞主意,除非equals()總是返回false(所以,沒有兩個對象永遠相等)。即使這樣,你也必須每次調用hashCode()時不要返回一個新的隨機數(當你將對象存儲在基於散列的集合中時,這會導致奇怪的錯誤)。

使用日期作爲hashCode()計算的一部分沒有問題,只要它是確定兩個對象是否彼此相等的標準之一即可。

+0

或者一個'HashSet'(它被承認是一個帶'Set'外觀的'HashMap')。 –

+1

@BoristheSpider或任何其他基於散列的集合。 – Jesper

相關問題