看到一個(gè)公眾號(hào)解釋這個(gè)問題又是畫圖又是講故事的,成功把很多人帶蒙了??赐暌院笪叶加行岩芍暗恼J(rèn)識(shí)了,重新理一遍。
首先看看Object默認(rèn)實(shí)現(xiàn)的equals方法
public boolean equals(Object obj) {
return (this == obj);
}
使用==號(hào),來判斷傳入的參數(shù)和自己是不是同一個(gè)內(nèi)存地址。
如果不重寫equals,那么不同的對(duì)象使用equals來比較返回的是false,因?yàn)閮?nèi)存地址的指向不同。
重寫了equals,自己人為的改變對(duì)象equals方法比較的條件,可以讓內(nèi)存地址不同的對(duì)象,使用equals方法在符合自定義條件的時(shí)候返回true。
舉例 有個(gè)User類,有no和age屬性,現(xiàn)在只要no相等,就認(rèn)為是同一個(gè)人,equals比較返回true,重寫equals方法如下
class User{
int no;
int age;
public boolean equals(Object obj) {
return (this.no == obj.no);
}
}
這樣兩個(gè)user對(duì)象使用equals方法,只要no相等,就返回true,認(rèn)為他們是同一個(gè)人。
這樣做有問題嗎?如果不使用Set 或Map等散列表結(jié)構(gòu)去存儲(chǔ)user對(duì)象,是沒有問題的。但是如果是用散列表結(jié)構(gòu)比如HashMap,就會(huì)有問題。
現(xiàn)在有2個(gè)User對(duì)象,user1和user2,no都是1,age隨意。重寫了equals方法如上例。不重寫hashCode方法。
使用一個(gè)HashMap map 存儲(chǔ)
map.put(user1,1)
map.put(user2,2)
這里使用user做key?,F(xiàn)在我用map.get(user1)得到的結(jié)果是什么呢?
預(yù)知后事如何
且聽下回分解