直播型網(wǎng)站開(kāi)發(fā)怎么在網(wǎng)上推廣廣告
API文件有對(duì)對(duì)象的狀態(tài)制定出必須遵循的規(guī)則。hashCode()和equals()是object中定義的兩個(gè)方法,它們都與對(duì)象的相等性有關(guān)。
通常情況下我們需要同時(shí)使用這兩個(gè)方法來(lái)判斷兩個(gè)對(duì)象是否相等,只有兩個(gè)對(duì)象的equals()方法返回true,并且它們的hashCode返回值相等,那么可以認(rèn)為這兩個(gè)對(duì)象相等。
hashCode()方法規(guī)定:
- 如果兩個(gè)對(duì)象相等,則hashCode必須是相等的。
- 如果兩個(gè)對(duì)象有相同的hashCode值,它們也不一定是相等的。
equals()方法規(guī)定,對(duì)于任何非null的引用值:
- 自反性:a.equals(a)必須返回true。
- 對(duì)稱性:當(dāng)前僅當(dāng)a.equals(b)返回true時(shí),b.equals(a)必須返回true。
- 傳遞性:如果a.equals(b)返回true,并且b.equals(c)也返回true,那么a.equals(c)也必須返回true。
- 一致性:只要equals()方法中所用到的信息沒(méi)有被修改,多次調(diào)用a.equals(b)就會(huì)一致的返回true或false。
- a.equals(null)必須返回false。
因此,若equals()被覆蓋過(guò),則hashCode()也必須被覆蓋:
- hashCode()的默認(rèn)行為是對(duì)heap上的對(duì)象產(chǎn)生獨(dú)特的值。如果沒(méi)有override過(guò)hashCode(),則該class的兩個(gè)對(duì)象怎么都不會(huì)被認(rèn)為是相同的。
- equals()的默認(rèn)行為是執(zhí)行==比較,也就是回去測(cè)試兩個(gè)引用是否對(duì)上heap上的同一個(gè)對(duì)象。如果沒(méi)有override過(guò)equals(),兩個(gè)對(duì)象永遠(yuǎn)都不會(huì)被認(rèn)為是相同的,因?yàn)椴煌膶?duì)象有不同的字節(jié)組合。
總結(jié):
- 兩個(gè)對(duì)象相等,a.equals(b)必須與a.hashCode() == b.hashCode()等值。
- 兩個(gè)對(duì)象hashCode相等也不一定相等,a.hashCode() == b.hashCode()不一定要與a.equals(b)等值。