關于重寫equals()與hashCode()

在HashMap與HashSet中,是不允許元素重復的。

在判定時比較元素的hashCode()是否相等,equals()是否返回true,那么問題來了

?

這是一個Person類

public class Person {
?? ?private String id;
?? ?private String name;
?? ?private Integer age;
?? ?public String getId() {
?? ??? ?return id;
?? ?}
?? ?public void setId(String id) {
?? ??? ?this.id = id;
?? ?}
?? ?public String getName() {
?? ??? ?return name;
?? ?}
?? ?public void setName(String name) {
?? ??? ?this.name = name;
?? ?}
?? ?public Integer getAge() {
?? ??? ?return age;
?? ?}
?? ?public void setAge(Integer age) {
?? ??? ?this.age = age;
?? ?}
?? ?@Override
?? ?public String toString() {
?? ??? ?return "Person [id=" + id + ", name=" + name + ", age=" + age + "]";
?? ?}
?? ?@Override
?? ?public int hashCode() {
?? ??? ?final int prime = 31;
?? ??? ?int result = 1;
?? ??? ?result = prime * result + ((age == null) ? 0 : age.hashCode());
?? ??? ?result = prime * result + ((id == null) ? 0 : id.hashCode());
?? ??? ?result = prime * result + ((name == null) ? 0 : name.hashCode());
?? ??? ?return result;
?? ?}
?? ?@Override
?? ?public boolean equals(Object obj) {
?? ??? ?if (this == obj)
?? ??? ??? ?return true;
?? ??? ?if (obj == null)
?? ??? ??? ?return false;
?? ??? ?if (getClass() != obj.getClass())
?? ??? ??? ?return false;
?? ??? ?Person other = (Person) obj;
?? ??? ?if (age == null) {
?? ??? ??? ?if (other.age != null)
?? ??? ??? ??? ?return false;
?? ??? ?} else if (!age.equals(other.age))
?? ??? ??? ?return false;
?? ??? ?if (id == null) {
?? ??? ??? ?if (other.id != null)
?? ??? ??? ??? ?return false;
?? ??? ?} else if (!id.equals(other.id))
?? ??? ??? ?return false;
?? ??? ?if (name == null) {
?? ??? ??? ?if (other.name != null)
?? ??? ??? ??? ?return false;
?? ??? ?} else if (!name.equals(other.name))
?? ??? ??? ?return false;
?? ??? ?return true;
?? ?}
?? ?/*@Override
?? ?public int hashCode() {
?? ??? ?System.out.println("id = " + id + ";id.hashCode = " + id.hashCode());
?? ??? ?return id.hashCode();
?? ?}
?? ?@Override
?? ?public boolean equals(Object obj) {
?? ??? ?System.out.println("equals");
?? ??? ?Person p = (Person)obj;
?? ??? ?if(this.id == p.id) {
?? ??? ??? ?return true;
?? ??? ?}else{
?? ??? ??? ?return false;
?? ??? ?}
?? ?}*/
}

?

這是一個Test類

public class TestHashCode {
?? ?public static void main(String[] args) {
?? ??? ?Set<Person> set = new HashSet<Person>();
?? ??? ?Person p1 = new Person();
?? ??? ?p1.setId("11");
?? ??? ?p1.setName("張三");
?? ??? ?p1.setAge(20);
?? ??? ?Person p2 = new Person();
?? ??? ?p2.setId("11");
?? ??? ?p2.setName("李四");
?? ??? ?p2.setAge(30);
?? ??? ?set.add(p1);
?? ??? ?set.add(p2);
?? ??? ?System.out.println(p1.hashCode() == p2.hashCode());
?? ??? ?System.out.println(p1.equals(p2));
?? ??? ?for (Person person : set) {
?? ??? ??? ?System.out.println(person.toString());
?? ??? ?}
?? ?}
}

?

如果Person的id屬性作為主鍵,且只重寫equals方法,我們認為id相等的兩個對象為同一個對象

此時p1.equals(p2)返回true,但是hashCode()卻不相等,而hashSet判斷唯一的依據是hashCode()值相等且equals()返回true

所以我們的預期是p1和p2為同一個對象,但是hashSet認為他們是兩個對象。

所以我們需要同時重寫hashCode()和equals()方法。

轉載于:https://www.cnblogs.com/cz305679760/p/4560137.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/273207.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/273207.shtml
英文地址,請注明出處:http://en.pswp.cn/news/273207.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

金算盤高手論壇資料中心_3D304期 菜鳥論壇精英PK專欄 速來圍觀!!

點上方“菜鳥選號論壇”→點右上角“...”→選“星標★”每日上午更新&#xff0c;星標置頂與大神不走散蘋果是置頂&#xff0c;安卓是星標 點擊"菜鳥選號論壇"關注我們論壇明星版塊&#xff0c;集全網各路高手之大乘&#xff0c;打造草根明星 展示舞臺。同時主要是為…

諸暨機器人餐廳價格_現場 | 一家嘗出“鍋氣”的餐廳 探店機器人餐廳

觀點地產網蔡瀾先生的書中曾說過&#xff0c;“食在廣東&#xff0c;其實是食在順德”&#xff0c;順德這座美食之都&#xff0c;滿足了對食物異常挑剔的廣東人的味蕾追求。最近&#xff0c;一家坐落“鳳城”順德的餐廳開業了。餐廳開業本身并沒什么稀奇&#xff0c;不過這是一…

VelocityTracker簡要

翻譯自&#xff1a;http://developer.android.com/reference/android/view/VelocityTracker.html參照自&#xff1a; http://blog.jrj.com.cn/4586793646,5298605a.html android.view.VelocityTracker主要用跟蹤觸摸屏事件&#xff08;flinging事件和其它gestures手勢事件&…

積木賽爾號機器人_賽爾號:譜尼三次敗北,經歷過被吊打、封印,一次比一次慘...

賽爾號&#xff1a;譜尼三次敗北&#xff0c;經歷過被吊打、封印&#xff0c;一次比一次慘。精靈類型的動漫層出不窮&#xff0c;在我們兒時看過精靈寶可夢、數碼寶貝等等作品。國內的動漫則是有賽爾號和洛克王國&#xff0c;相較而言還是賽爾號更加的出名一些&#xff0c;更加…

xenu工具介紹

Xenu Link Sleuth 也許是你所見過的最小但功能最強大的檢查網站死鏈接的軟件了。你可以打開一個本地網頁文件來檢查它的鏈接&#xff0c;也可以輸入任何網址來檢查。它可以分別列出網站 的活鏈接以及死鏈接&#xff0c;連轉向鏈接它都分析得一清二楚&#xff1b;支持多線程&…

安卓模擬器_exagear模擬器安卓模擬器

Exagear模擬器簡介讓Android 設備用戶重溫經典 PC 游戲&#xff0c;來自俄羅斯的初創公司 Eltechs發布了一款全新的 Android 游戲模擬器 ExaGear Strategies。該游戲模擬器的主要功能就是將經典的 PC 游戲帶到 Android 智能手機或平板電腦上來。公告1.exagear軟件和游戲&#x…

HBase 常用Shell命令

兩個月前使用過hbase&#xff0c;現在最基本的命令都淡忘了&#xff0c;留一個備查~ 進入hbase shell console$HBASE_HOME/bin/hbase shell如果有kerberos認證&#xff0c;需要事先使用相應的keytab進行一下認證&#xff08;使用kinit命令&#xff09;&#xff0c;認證成功之后…

將Excle數據導入到數據庫

假如Excel中的數據如下&#xff1a; 數據庫建表如下&#xff1a; 其中Id為自增字段&#xff1a; 代碼&#xff1a; 1 using System;2 using System.Collections.Generic;3 using System.Linq;4 using System.Web;5 using System.Web.UI;6 using System.Web.UI.WebControls;7 us…

click vue 重復調用_VUE防止多次點擊,重復請求

VUE防止多次點擊&#xff0c;重復請求1.添加自定義文件 preventReClick.jsimport Vue from vueconst preventReClick Vue.directive(preventReClick, {inserted: function (el, binding) {el.addEventListener(click, () > {if (!el.disabled) {el.disabled truesetTimeou…

virbr0怎么關閉_CentOS 7中關閉刪除virbr0虛擬網卡

在CentOS 7的安裝過程中如果有選擇相關虛擬化的的服務安裝系統后&#xff0c;啟動網卡時會發現有一個以網橋連接的私網地址的virbr0網卡&#xff0c;這個是因為在虛擬化中有使用到libvirtd服務生成的&#xff0c;如果不需要可以關閉后去掉&#xff1a;[rootlocalhost ~]# virsh…

動態規劃(五) 最大連續子序列和(Maximum Continuous Subsequence Sum)

占位...轉載于:https://www.cnblogs.com/AloneAli/p/4580931.html

python中beautifulsoup是什么庫_BeautifulSoup庫詳解(個人整理)

BeautifulSoup4是爬蟲必學的技能。BeautifulSoup最主要的功能是從網頁抓取數據&#xff0c;Beautiful Soup自動將輸入文檔轉換為Unicode編碼&#xff0c;輸出文檔轉換為utf-8編碼。BeautifulSoup支持Python標準庫中的HTML解析器,還支持一些第三方的解析器&#xff0c;如果我們不…

iOS 設置系統音量和監聽系統音量變化

很簡單的調用 首先在工程引入MediaPlayer.framework #import <MediaPlayer/MediaPlayer.h> 1. 獲取系統音量 // 獲取系統音量 MPVolumeView *volumeView [[MPVolumeView alloc] init];UISlider *volumeViewSlider nil;for (UIView *view in [volumeView subviews]){if …

h5關于選擇器以及class的小加強

1、querySelector和querySelectorAll 這兩個方法類似于jquery的選擇器 document.querySelector(.box) document.querySelectorAll(.box)前者只能選擇一組中的第一個&#xff0c;后者選擇一組元素。 2、getElementsByClassName document.getElementsByClassName(box) 選擇的結…

1 睡眠喚醒_一勞永逸解決WIN10所有睡眠問題

1.初級階段&#xff0c;解決因硬件的喚醒事件powercfg -lastwake查看上次喚醒電腦的設備哪些硬件能喚醒電腦&#xff1f;powercfg /devicequery wake_armed列出現在可以喚醒電腦的所有硬件設備&#xff0c;可以看到現在鍵盤能喚醒powercfg /devicequery wake_programmable列出全…

[轉]Device Context 設備環境 設備上下文 理解

http://blog.csdn.net/p424671075/article/details/7235601轉載于:https://www.cnblogs.com/qrlozte/p/4582594.html

生成路徑 vs 設置_Simulink代碼生成之模型配置

歡迎關注我的微信公眾號【新能源動力電池與BMS】&#xff0c;頭條號&#xff1a;【阿Q在江湖】&#xff1b;所有文章資料會在公眾號首發。本文已同步錄制視頻講解&#xff1a;Simulink代碼生成之模型配置_視頻教程 - 知乎。PS&#xff1a;前段時間&#xff0c;傳出美國禁用一些…

常見電容器圖片_各種電容器圖片大集合

圖1是膽&#xff1b;圖2是燈具&#xff1b;圖3是mkph電容&#xff1b;圖4是met電容&#xff1b;圖5、圖10是pei電容&#xff1b;圖6是膽貼片電容&#xff1b;圖7是mpe電容&#xff1b;圖8是貼片電容&#xff1b;圖11是軸向電解電容器&#xff1b;圖12是mpp電容。圖1是ppn電容&a…

解析php混淆加密解密的手段,如 phpjm,phpdp神盾,php威盾

解析php混淆加密解密的手段&#xff0c;如 phpjm,phpdp神盾,php威盾 原文 解析php混淆加密解密的手段&#xff0c;如 phpjm,phpdp神盾,php威盾 php做為一門當下非常流行的web語言&#xff0c;常常看到有人求解密php文件&#xff0c;想當年的asp也是一樣。一些人不理解為什么要混…

bootstrap 合并菜單_Bootstrap與tab組合,切換菜單實例

Test$(function () {$(#myTab a:last).tab(show);//初始化顯示哪個tab$(#myTab a).click(function (e) {e.preventDefault();//阻止a鏈接的跳轉行為$(this).tab(show);//顯示當前選中的鏈接及關聯的content})})HomeProfileMessagesSettings服務器.home....profile...messages..…