我正在從文件加載網絡流量數據。我正在加載的信息是攻擊者 IP 地址、受害者 IP 地址和日期。我已將這些數據組合成一個Traffic對象,并為其定義了hashCode和equals函數。盡管如此,HashMap我將它們加載到將相同的Traffic對象視為不同的鍵。整個 Traffic 對象在方法中包含一些簡單的測試代碼,main如下所示:import java.util.HashMap;public class Traffic { public String attacker; public String victim; public int date; //constructors, getters and setters @Override public int hashCode() { long attackerHash = 1; for (char c:attacker.toCharArray()) { attackerHash = attackerHash * Character.getNumericValue(c) + 17; } long victimHash = 1; for (char c:victim.toCharArray()) { victimHash = victimHash * Character.getNumericValue(c) + 17; } int IPHash = (int)(attackerHash*victimHash % Integer.MAX_VALUE); return (IPHash + 7)*(date + 37) + 17; } public boolean equals(Traffic t) { return this.attacker.equals(t.getAttacker()) && this.victim.equals(t.getVictim()) && this.date == t.getDate(); } public static void main(String[] args) { Traffic a = new Traffic("209.167.099.071", "172.016.112.100", 7); Traffic b = new Traffic("209.167.099.071", "172.016.112.100", 7); System.out.println(a.hashCode()); System.out.println(b.hashCode()); HashMap<Traffic, Integer> h = new HashMap<Traffic, Integer>(); h.put(a, new Integer(1)); h.put(b, new Integer(2)); System.out.println(h); }}我無法說出我的哈希方法的強度,但前兩個打印的輸出是相同的,這意味著它至少適用于這種情況。由于 a 和 b 的數據相同(因此equals返回 true),并且哈希值相同,因此HashMap應該將它們識別為相同并將值從 1 更新為 2,而不是創建值為 2 的第二個條目。不幸的是,它確實如此無法將它們識別為相同,最終打印的輸出如下:{packagename.Traffic@1c051=1, packagename.Traffic@1c051=2}我對此的最佳猜測是,HashMap內部運作忽略了我的習慣hashCode和equals方法,但如果是這樣的話,那為什么呢?如果這個猜測是錯誤的,那么這里發生了什么?
1 回答

函數式編程
TA貢獻1807條經驗 獲得超9個贊
這里的問題是你的equals方法,它沒有覆蓋Object#equals. 為了證明這一點,下面的注釋將無法編譯@Override:
@Override
public boolean equals(Traffic t) {
return this.attacker.equals(t.getAttacker()) &&
this.victim.equals(t.getVictim()) &&
this.date == t.getDate();
}
HashMap使用的實現Object#equals而不是您的自定義實現。您的equals方法應該接受 anObject作為參數:
@Override
public boolean equals(Object o) {
if (!(o instanceof Traffic)) {
return false;
}
Traffic t = (Traffic) o;
return Objects.equals(attacker, t.attacker) &&
Objects.equals(victim, t.victim) &&
date == t.date;
}
添加回答
舉報
0/150
提交
取消