Java中重寫了equals為什么還要重寫hashCode?-創(chuàng)新互聯(lián)

問題

不管是在書本或者是博客上,都會推薦我們在重寫 equals 方法時(shí)重寫 hashCode 方法。明明對象之間就是通過 equals 方法進(jìn)行判斷的,那么為什么非要寫 hashCode 方法呢?

我們提供的服務(wù)有:成都做網(wǎng)站、成都網(wǎng)站設(shè)計(jì)、微信公眾號開發(fā)、網(wǎng)站優(yōu)化、網(wǎng)站認(rèn)證、三元ssl等。為千余家企事業(yè)單位解決了網(wǎng)站和推廣的問題。提供周到的售前咨詢和貼心的售后服務(wù),是有科學(xué)管理、有技術(shù)的三元網(wǎng)站制作公司equals 實(shí)驗(yàn)

創(chuàng)建一個(gè) Teacher 類。方便起見,就一個(gè) name 屬性。

public class Teacher {public Teacher() {}

    public Teacher(String name) {this.name = name;
    }

    private String name;

    public void setName(String name) {this.name = name;
    }

    public String getName() {return name;
    }

    @Override
    public String toString() {return "Teacher{" +
                "name='" + name + '\'' +
                '}';
    }
}

我們都知道,如果不重寫 equals 方法,默認(rèn)是通過 == 來比較兩個(gè)對象,那么不是同一個(gè)對象肯定不相等。但是實(shí)際業(yè)務(wù)中,都是通過屬性是否相等來判斷兩個(gè)對象是否為同一個(gè)。
重寫 equals 前

@Slf4j
public class EqualsTest {public static void main(String[] args) {Teacher teacher1 = new Teacher("李四");
        Teacher teacher2 = new Teacher("李四");
        log.info("兩個(gè)對象是否相同 ? {}", teacher1.equals(teacher2));
    }
}

在這里插入圖片描述
重寫 equals 方法后

@Override
    public boolean equals(Object o) {if (this == o) {return true; }
        if (!(o instanceof Teacher)) {return false; }
        Teacher teacher = (Teacher) o;
        return getName() != null ? getName().equals(teacher.getName()) : teacher.getName() == null;
    }

在這里插入圖片描述
可以看到,我們并沒有重寫 hashCode 方法,只是重寫了 equals 方法,就能實(shí)現(xiàn)對象相等比較了呀,為啥還要用 hashCode?關(guān)鍵就在于將對象存儲在哈希(散列)集合中會出問題。

問題復(fù)現(xiàn)

先看如下代碼,想一下 Set 集合中最終有幾個(gè)元素。

@Slf4j
public class EqualsTest {public static void main(String[] args) {Teacher teacher1 = new Teacher("李四");
        Teacher teacher2 = new Teacher("李四");
        Teacher teacher3 = new Teacher("李四");
        Teacher teacher4 = new Teacher("李四");
        Setteachers = new HashSet<>();
        teachers.add(teacher1);
        teachers.add(teacher2);
        teachers.add(teacher3);
        teachers.add(teacher4);
        log.warn("集合大小: {}", teachers.size());
        teachers.forEach(System.out::println);
    }
}

在這里插入圖片描述可以看到,HashSet 并沒有去重,四個(gè)相同的對象,都保存進(jìn)了 HashSet。這就是沒有重寫 hashCode 方法導(dǎo)致的結(jié)果。
這里我先說結(jié)論:在 Java 中,當(dāng)往哈希(散列)集合中添加元素時(shí),先去判斷 hashCode 值是否相同,如果不同,則直接插入。如果相同,才去判斷 equals。
可以自己重寫一個(gè) hashCode 方法,比如寫死返回 1。然后 equals 寫死返回 false。然后在 add 方法,hashCode 方法,equals 方法上分別打上斷點(diǎn)。那么此時(shí)集合中有四個(gè) Teacher 對象。如果 equals 寫死返回 true,則集合中只有一個(gè)對象。
在這里插入圖片描述
在這里插入圖片描述

你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級服務(wù)器適合批量采購,新人活動首月15元起,快前往官網(wǎng)查看詳情吧

網(wǎng)站標(biāo)題:Java中重寫了equals為什么還要重寫hashCode?-創(chuàng)新互聯(lián)
文章分享:http://bm7419.com/article22/dicgjc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站策劃、網(wǎng)站收錄、商城網(wǎng)站、自適應(yīng)網(wǎng)站、網(wǎng)站設(shè)計(jì)網(wǎng)站排名

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

小程序開發(fā)