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

問題

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

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

創(chuàng)建一個 Teacher 類。方便起見,就一個 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 方法,默認是通過 == 來比較兩個對象,那么不是同一個對象肯定不相等。但是實際業(yè)務中,都是通過屬性是否相等來判斷兩個對象是否為同一個。
重寫 equals 前

@Slf4j
public class EqualsTest {public static void main(String[] args) {Teacher teacher1 = new Teacher("李四");
        Teacher teacher2 = new Teacher("李四");
        log.info("兩個對象是否相同 ? {}", 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 方法,就能實現(xiàn)對象相等比較了呀,為啥還要用 hashCode?關鍵就在于將對象存儲在哈希(散列)集合中會出問題

問題復現(xiàn)

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

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

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

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

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

廣告

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

小程序開發(fā)
主站蜘蛛池模板: 久久精品无码一区二区三区不卡| 亚洲国产av高清无码| 粉嫩大学生无套内射无码卡视频 | 免费看又黄又无码的网站| 精品无码无人网站免费视频| 韩国精品一区二区三区无码视频| 中文字幕无码视频专区| 亚洲最大av资源站无码av网址| 人妻少妇伦在线无码| 综合无码一区二区三区四区五区| 精品无码一级毛片免费视频观看| 亚洲国产精品无码观看久久| 亚洲Av永久无码精品三区在线| 韩国精品一区二区三区无码视频| 无码人妻精品一区二区三区久久| 日韩人妻系列无码专区| 精品久久无码中文字幕| 国产亚洲美日韩AV中文字幕无码成人| 亚洲中文字幕久久精品无码VA| 日韩人妻无码精品系列| 国产精品第一区揄拍无码| 2019亚洲午夜无码天堂| 亚欧免费无码aⅴ在线观看| 亚洲精品无码专区久久同性男| 亚洲日韩精品无码专区| 无码区国产区在线播放| 国产在线无码不卡影视影院| 一本大道久久东京热无码AV| 精品无码专区亚洲| 亚洲国产精品无码久久| 18精品久久久无码午夜福利| 无码av最新无码av专区| 无码137片内射在线影院| 亚洲国产精品无码久久一区二区 | 69成人免费视频无码专区| 亚洲精品无码久久久久YW| 亚洲日韩国产二区无码| 亚洲精品无码人妻无码| 无码亚洲成a人在线观看| 国产久热精品无码激情| 无码精品不卡一区二区三区|