我有多個記錄有相似的ID。數據庫是非常傳統的。沒有這樣獨特的專欄。創建日期列用於保存在數據庫中創建行的時間戳。我必須在java map中保留記錄來做一些操作。對於記錄的任何更改,它會創建新記錄。我不想保留hashcode和equals中的所有字段。因爲,我不確定哪個列是針對某個ID進行更改的。把日期放在哈希碼中是不是很好的做法?
首先,我嘗試使用隨機數生成器來生成唯一的哈希碼。有用。
其次,我已決定將創建的日期列放在哈希碼中。它也可以。
把日期放在hashcode中有什麼不利嗎?
我有多個記錄有相似的ID。數據庫是非常傳統的。沒有這樣獨特的專欄。創建日期列用於保存在數據庫中創建行的時間戳。我必須在java map中保留記錄來做一些操作。對於記錄的任何更改,它會創建新記錄。我不想保留hashcode和equals中的所有字段。因爲,我不確定哪個列是針對某個ID進行更改的。把日期放在哈希碼中是不是很好的做法?
首先,我嘗試使用隨機數生成器來生成唯一的哈希碼。有用。
其次,我已決定將創建的日期列放在哈希碼中。它也可以。
把日期放在hashcode中有什麼不利嗎?
的哈希碼和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;
}
}
如果你把一些東西放在一個Map中,那麼我假設你想以後用它來獲取它。密鑰的HashCode()用於標識元素屬於哪個存儲分區。然後在bucket中的所有元素上使用equals()方法來查找匹配。通過使用hashcode()的隨機數生成器,您將無法在映射中找到密鑰,因爲如果密鑰沒有更改,hashcode()函數應該每次返回相同的值。
首先,只有當您使用這些對象爲鍵在HashMap
需要equals()
和hashCode()
方法。
必須有一些概念來確定這些對象相互「相等」的含義。您必須以反映此觀點的方式實施您的equals()
和hashCode()
方法。
對散列碼使用隨機數是一個壞主意,除非equals()
總是返回false
(所以,沒有兩個對象永遠相等)。即使這樣,你也必須每次調用hashCode()
時不要返回一個新的隨機數(當你將對象存儲在基於散列的集合中時,這會導致奇怪的錯誤)。
使用日期作爲hashCode()
計算的一部分沒有問題,只要它是確定兩個對象是否彼此相等的標準之一即可。
或者一個'HashSet'(它被承認是一個帶'Set'外觀的'HashMap')。 –
@BoristheSpider或任何其他基於散列的集合。 – Jesper
hashCode由java中基於散列的集合使用。對於基於散列的集合,它們的工作速度必須不同。所以如果你想知道更多的hashmap,hashset請覆蓋[我的教程](http://volodial.blogspot。com/search/label/Java%20Collections) –