第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

HashMap 忽略重寫(xiě)的 hashCode 和 equals 方法

HashMap 忽略重寫(xiě)的 hashCode 和 equals 方法

慕虎7371278 2023-10-13 17:21:24
我正在從文件加載網(wǎng)絡(luò)流量數(shù)據(jù)。我正在加載的信息是攻擊者 IP 地址、受害者 IP 地址和日期。我已將這些數(shù)據(jù)組合成一個(gè)Traffic對(duì)象,并為其定義了hashCode和equals函數(shù)。盡管如此,HashMap我將它們加載到將相同的Traffic對(duì)象視為不同的鍵。整個(gè) Traffic 對(duì)象在方法中包含一些簡(jiǎn)單的測(cè)試代碼,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);    }}我無(wú)法說(shuō)出我的哈希方法的強(qiáng)度,但前兩個(gè)打印的輸出是相同的,這意味著它至少適用于這種情況。由于 a 和 b 的數(shù)據(jù)相同(因此equals返回 true),并且哈希值相同,因此HashMap應(yīng)該將它們識(shí)別為相同并將值從 1 更新為 2,而不是創(chuàng)建值為 2 的第二個(gè)條目。不幸的是,它確實(shí)如此無(wú)法將它們識(shí)別為相同,最終打印的輸出如下:{packagename.Traffic@1c051=1, packagename.Traffic@1c051=2}我對(duì)此的最佳猜測(cè)是,HashMap內(nèi)部運(yùn)作忽略了我的習(xí)慣hashCode和equals方法,但如果是這樣的話,那為什么呢?如果這個(gè)猜測(cè)是錯(cuò)誤的,那么這里發(fā)生了什么?
查看完整描述

1 回答

?
函數(shù)式編程

TA貢獻(xiàn)1807條經(jīng)驗(yàn) 獲得超9個(gè)贊

這里的問(wèn)題是你的equals方法,它沒(méi)有覆蓋Object#equals. 為了證明這一點(diǎn),下面的注釋將無(wú)法編譯@Override:


@Override

public boolean equals(Traffic t) {

    return this.attacker.equals(t.getAttacker()) && 

        this.victim.equals(t.getVictim()) && 

        this.date == t.getDate();

}

HashMap使用的實(shí)現(xiàn)Object#equals而不是您的自定義實(shí)現(xiàn)。您的equals方法應(yīng)該接受 anObject作為參數(shù):


@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;

}


查看完整回答
反對(duì) 回復(fù) 2023-10-13
  • 1 回答
  • 0 關(guān)注
  • 143 瀏覽
慕課專(zhuān)欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢(xún)優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)