@Override
public boolean equals(Object obj) {
if(obj==null)return false;
if(this==obj)return true;
if(obj instanceof User) {
TestentityEntity u = (TestentityEntity) obj;
return this.getId()==u.getId()
&&this.getTname().equals(u.getTname())
&&this.getTid().equals(u.getTid())
}
return false;
}
equals與==的區(qū)別。
== 比較的是變量(棧)內(nèi)存中存放的對(duì)象的(堆)內(nèi)存地址愁溜,用來(lái)判斷兩個(gè)對(duì)象的地址是否相同,即是否是指相同一個(gè)對(duì)象。比較的是真正意義上的指針操作蛤售。
equals用來(lái)比較的是兩個(gè)對(duì)象的內(nèi)容是否相等,由于所有的類都是繼承自java.lang.Object類的妒潭,所以適用于所有對(duì)象悴能,如果沒(méi)有對(duì)該方法進(jìn)行覆蓋的話,調(diào)用的仍然是Object類中的方法雳灾,而Object中的equals方法返回的卻是==的判斷漠酿。Hashcode的作用。
hashCode()方法是為任何一個(gè)對(duì)象生成一個(gè)哈希碼谎亩,相同(邏輯上認(rèn)為)的對(duì)象應(yīng)該生成相同的哈希碼炒嘲,Java內(nèi)置的求出的哈希碼是基于存儲(chǔ)地址的一個(gè)映射關(guān)系,保證了對(duì)象的哈希碼的一一對(duì)應(yīng)關(guān)系匈庭。散列存儲(chǔ)夫凸,即是根據(jù)一個(gè)關(guān)鍵字找到對(duì)應(yīng)的對(duì)象,存在對(duì)應(yīng)的哈希表里阱持,重寫equals()方法就必須重寫hashCode()
重寫equals()方法就必須重寫hashCode()方法主要是針對(duì)HashSet和Map集合類型 寸痢。集合框架只能存入對(duì)象(對(duì)象的引用(基本類型數(shù)據(jù):自動(dòng)裝箱))。
在向HashSet集合中存入一個(gè)元素時(shí)紊选,HashSet會(huì)調(diào)用該對(duì)象(存入對(duì)象)的hashCode()方法來(lái)得到該對(duì)象的hashCode()值,然后根據(jù)該hashCode值決定該對(duì)象在HashSet中存儲(chǔ)的位置道逗。簡(jiǎn)單的說(shuō):HashSet集合判斷兩個(gè)元素相等的標(biāo)準(zhǔn)是:兩個(gè)對(duì)象通過(guò)equals()方法比較相等兵罢,并且兩個(gè)對(duì)象的HashCode()方法返回值也相等。如果兩個(gè)元素通過(guò)equals()方法比較返回true滓窍,但是它們的hashCode()方法返回值不同卖词,HashSet會(huì)把它們存儲(chǔ)在不同的位置,依然可以添加成功吏夯。同樣:在Map集合中此蜈,例如其子類Hashtable(jdk1.0錯(cuò)誤的命名規(guī)范),HashMap噪生,存儲(chǔ)的數(shù)據(jù)是key,value對(duì)裆赵,key,value都是對(duì)象跺嗽,被封裝在Map.Entry战授,即:每個(gè)集合元素都是Map.Entry對(duì)象页藻。在Map集合中,判斷key相等標(biāo)準(zhǔn)也是:兩個(gè)key通過(guò)equals()方法比較返回true植兰,兩個(gè)key的hashCode的值也必須相等份帐。判斷valude是否相等equal()相等即可。
稍微提一句:
(1)兩個(gè)對(duì)象楣导,用==比較比較的是地址废境,需采用equals方法(可根據(jù)需求重寫)比較。
(2)重寫equals()方法就重寫hashCode()方法筒繁。
(3)一般相等的對(duì)象都規(guī)定有相同的hashCode噩凹。
集合類都重寫了toString方法。String類重寫了equal和hashCode方法膝晾,比較的是值栓始。