不管是在書本或者是博客上,都會推薦我們在重寫 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)鍵就在于將對象存儲在哈希(散列)集合中會出問題。
先看如下代碼,想一下 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)
猜你還喜歡下面的內(nèi)容